简单的try / catch没有使用异常

时间:2012-08-15 09:45:49

标签: c# error-handling

我已经搜索了我的问题的答案,但找不到答案。如果答案在那里并且我正在重复,请道歉!

我一直在看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!");
}

不是一个大问题,但肯定知道会很好!

由于

佛瑞德

8 个答案:

答案 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重新抛出异常以保留堆栈跟踪,否则您将丢失详细信息。再一次,替代方案是根本没有抓住它。如果您对异常没有任何用处(恢复,放松等),很可能没有理由抓住它。

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

另请参阅:"Back to Basics - Exceptions"

答案 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
}

or just catch

答案 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