2012-08-15 45 views
9

我已经搜索了我的问题的答案,但没能找到一个。道歉,如果答案在那里,我复制!简单的尝试/捕获不使用任何异常

我一直看到的try/catch代码,比如.....

try 
{ 
    //Do whatever 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

这将导致在警告前从未使用过。

所以我的问题是......尽管ex从未使用过,但声明中是否有任何好处?我被告知可能会增加堆栈跟踪的细节?有时我会看到catch(Exception),它会停止警告,但是这会带来什么好处?如果我是写这个,而不是使用异常以任何方式我不会宣布前...

try 
{ 
    //Do whatever 
} 
catch 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

不是什么大问题,但它是很好的了解肯定的!

感谢

弗雷德

+0

你可能想实际的异常写入日志,以便以后可以调试它,即使你从来没有展示给用户。 – Rup 2012-08-15 09:47:55

+0

是的,如果你对什么地方出错没有兴趣(取决于你),你可以不用声明异常 – bizl 2012-08-15 09:50:50

+0

,因为你可以有多个catch,所以你可以写catch(BadFormatException){/ * bad format这里* /} catch(Exception ex){/ *未知错误在这里* /}'。我认为这将是使用'catch(Exception)'的一个理由' – Default 2012-08-15 09:51:23

回答

10

您可以使用下面的模式,仍然宣布具体的异常类型,没有一个变量,以确保结构化异常处理(SEH)仍在进行之中:

try 
{ 
    //Do whatever 
} 
catch (IOException) 
{ 
    MessageBox.Show("Oops, something went wrong in the IO!"); 
} 
catch (Exception) 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

这不是我通常会用到的做法,因为如果不重新推出它,我可能会记录异常详细信息。

+0

我不知道你可以捕获一个异常,而不必将它分配给一个变量(例如“IOException ex”),直到我遇到这个。谢谢! – 2016-08-26 16:53:08

1

您可以使用,对于以后的使用,包括日志记录,短信等ex变量

try 
{ 
    //Do whatever 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 

} 

假设你希望记录的异常,以至于后来开发商可以查看日志并确定发生了什么问题。在这种情况下,ex将包含记录所需的所有必要细节。例如堆栈跟踪,信息,如果的InnerException任何等

对于您的问题:

虽然从未使用前是否有在声明中没有优惠?

如果您不打算使用,那么在声明它时没有任何好处。

有人告诉我,它可能会增加堆栈跟踪的细节?

我不确定,但我认为它没有。如果你定义了一个,那么它将包含异常的堆栈跟踪,但它不会添加任何东西。

有时我看到catch(Exception)会停止警告,但是这会带来什么好处?

如果你想重新抛出使用throw关键字之外,你可以使用catch(Exception)

+0

对不起,也许我应该说。我明白为什么你会有这个声明和你可以捕捉的不同类型的优秀选项。我不知道的是,如果你不打算使用它,宣言是否有任何好处。似乎对我毫无意义,但有什么我失踪? – Fred 2012-08-15 09:52:17

0

没有,有没有点在声明它,除非你使用它。

3

抑制异常通常是不好的形式......让他们走上堆栈。

关于“增加详细信息”,使用throw重新抛出异常以保留堆栈跟踪,否则您将丢失详细信息。再次,另一种方法是根本就没有抓住它。如果你对异常没有任何用处(恢复,放松等),很可能没有理由去捕捉它。

参见:What is the proper way to re-throw an exception in C#?

参见:"Back to Basics - Exceptions"

3

重要的是要注意,在你的两个贴的代码块的差别是非常重要的。 catch (Exception ex)只会捕获CLR定义的异常(从Exception派生的异常)。单独会捕获任何东西 - 包括CLR尚未捕获或包装的非托管异常。

如果你想避免你的编译器警告不改变代码的行为,或者如果你想避免,同时仍捕获特定的异常类型的警告时,您可以使用它代替:

catch (Exception) 
{ 
} 

的例如,您可以特定:catch (SqlException)。如果你没有使用变量,那么声明给出警告,但类型特定的行为仍然有用。

无论如何,除非您明确地包装和/或重新抛出异常,否则声明异常不会向信息(堆栈跟踪或其他)添加任何内容。 (顺便说一句,不要使用throw ex重新抛出,因为这确实丢失信息:只需使用throw

1

如果你真的不想做任何的异常,你也可以像这样可以避免编译器警告:

catch (Exception) 
{ 
    // Stick our head in the sand 
} 

or just catch

1

这是所有关于开发商和他的实现在以后的学期适当的日志/调试能力......

这样的:

catch (Exception ex) 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

可以很容易地转换为

catch (Exception ex) 
{ 
    Log.Append(ex); 
    MessageBox.Show("Oops, something went wrong. Please check the Log file."); 
} 

有时它只是那里用于调试当您逐行运行,并且您可以在上有一个断点210行并阅读ex变量。

它有它的用处,但在编译的时候,如果你不使用它,你会得到一个警告该变量ex声明并没有使用,所以,你可以跟踪所有这些枯萎日志它,或删除它。

再说一次,这都是关于程序员的选择,并且......一个未使用的变量在结束程序中并不存在问题。

0

Exception ex这将是运行时异常对象的引用可以带来多种优势。作为开发人员,您自己可以将其记录在文本文件中或向您自己发送报告。

由于MSDN的文档:

如果你想重新引发当前由 参数少catch子句处理异常,使用throw语句不 参数。

http://msdn.microsoft.com/en-us/library/0yd65esw%28v=vs.80%29.aspx