我已经搜索了我的问题的答案,但找不到答案。如果答案在那里并且我正在重复,请道歉!
我一直在看try / catch代码,比如......
try
{
//Do whatever
}
catch (Exception ex)
{
MessageBox.Show("Oops, something went wrong!");
}
这将导致警告ex从未使用过。
所以我的问题是......虽然从未使用过ex,但声明中是否有任何好处?有人告诉我,它可能会为堆栈跟踪添加细节吗?有时我看到catch(Exception)会停止警告但是这带来了什么好处呢?如果我要写这个并且不以任何方式使用异常,我就不会声明ex ...
try
{
//Do whatever
}
catch
{
MessageBox.Show("Oops, something went wrong!");
}
不是一个大问题,但肯定知道会很好!
由于
佛瑞德
答案 0 :(得分:10)
您可以使用以下模式,仍然声明特定的异常类型,而不使用变量,以确保仍然发生结构化异常处理(SEH):
try
{
//Do whatever
}
catch (IOException)
{
MessageBox.Show("Oops, something went wrong in the IO!");
}
catch (Exception)
{
MessageBox.Show("Oops, something went wrong!");
}
这不是我通常会使用的做法,因为如果不重新抛出它,我可能会记录异常细节。
答案 1 :(得分:3)
抑制异常通常是不好的形式......让它们向上移动。
关于“添加详细信息”,使用throw
重新抛出异常以保留堆栈跟踪,否则您将丢失详细信息。再一次,替代方案是根本没有抓住它。如果您对异常没有任何用处(恢复,放松等),很可能没有理由抓住它。
答案 2 :(得分:3)
重要的是要注意两个已发布的代码块之间存在差异。 catch (Exception ex)
只会捕获CLR定义的异常(来自Exception
的异常)。仅catch
就可以捕获任何内容 - 包括CLR未捕获或自行封装的非托管异常。
如果您想在不改变代码行为的情况下避免编译器警告,或者如果您想在仍然捕获特定异常类型时避免警告,则可以使用此代码:
catch (Exception)
{
}
这里的好处是你可以具体:catch (SqlException)
,例如。如果你没有使用变量,那么声明给出警告,但特定于类型的行为仍然有用。
无论如何,声明异常不会向信息添加任何内容(堆栈跟踪或其他内容),除非您明确地包装和/或重新抛出异常。 (顺便说一句,请勿使用throw ex
重新抛出,因为此 会丢失信息:只需使用throw
。)
答案 3 :(得分:1)
您可以使用该ex
变量供以后使用,包括日志记录,消息传递等。
try
{
//Do whatever
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
假设您要记录异常,以便稍后开发人员可以查看日志并确定出现了什么问题。在这种情况下,ex
将包含日志记录所需的所有必要详细信息。例如StackTrace,Message,InnerException等等。
对于你的问题:
虽然从未使用过ex,但声明中是否有任何好处?
如果您不打算使用,那么宣布它没有任何好处。
我被告知可能会为堆栈跟踪添加细节吗?
我不确定,但我认为不是。如果你定义一个,那么它将包含异常的堆栈跟踪,但它不会添加任何内容。
有时候我会看到catch(异常)停止警告但是什么 这带来的好处,如果有的话?
如果您想使用throw
关键字重新抛出异常,可以使用catch(Exception)
答案 4 :(得分:1)
如果你真的不想对异常做任何事情,你也可以这样做,以避免编译器警告:
catch (Exception)
{
// Stick our head in the sand
}
答案 5 :(得分: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.");
}
当你逐行运行时,有时它只是用于调试,你可以在MessageBox.Show
行上有一个断点并阅读ex
变量。
它有用,但是,在编译时,如果你不使用它,你会得到一个警告,声明变量ex
并且没有使用它,所以,你可以跟踪所有这些并枯萎登录或删除它。
同样,这完全取决于程序员的选择,并且...一个未使用的变量在结束程序中没有问题。
答案 6 :(得分:0)
不,除非您真正使用它,否则宣布它是没有意义的。
答案 7 :(得分:0)
将成为运行时异常对象引用的Exception ex
可以提供多种优势。您自己作为开发人员可以将其记录在文本文件中或向自己发送报告。
截至MSDN文档:
如果要重新抛出当前由a处理的异常 无参数catch子句,不使用throw语句 参数。
http://msdn.microsoft.com/en-us/library/0yd65esw%28v=vs.80%29.aspx