尝试内外捕捉?

时间:2012-07-18 23:30:56

标签: c# exception-handling try-catch

什么更好,为什么:

:此

public void Main()
{
    SomeMethod();
}
public void SomeMethod()
{
  try
  {
     // code
  }
  catch(Exception)
  {
  }
}

或者这个:

public void Main()
{
    try
    {
        SomeMethod();
    }
    catch(Exception)
    {
    }
}

7 个答案:

答案 0 :(得分:4)

答案是:“在知道如何处理它的最低级别捕获异常。”

答案 1 :(得分:2)

有一种想法是你应该捕获最接近它们出现位置的异常(即尽可能高/最合适的调用堆栈)。一揽子异常处理程序通常不是一个好主意,因为它大大减少了可用的控制流。粗粒度异常处理非常重要,但不是程序稳定性的合理解决方案。不幸的是,许多初学者开发人员认为它是,并采取这种方法,如这个毯子try-catch语句。

这样说,如果您在程序的其余部分中正确使用了异常处理(以细粒度和特定于任务的方式),并相应地处理了错误(而不仅仅是显示一般错误框),那么Main方法中所有异常的一般try-catch可能是一个有用的东西。这里要注意的一点是,如果你在这个主要的try-catch中遇到了bug,那么你要么有一个bug,要么你的本地化异常处理有问题。

这个try-catch与Main的主要用途纯粹是为了防止程序在非常特殊的情况下崩溃,并且几乎不应该向用户显示(模糊地)用户友好的“致命错误”消息或者只是留空,以及可能在某处记录错误和/或提交错误报告。

致谢:Noldorin

答案 2 :(得分:2)

有关C#中异常处理的指导,请参阅Exceptions and Exception Handling (C# Programming Guide)This interview与Anders Hejlsberg也提供了丰富的信息。

此处的相关指南是:

  

除非您能够处理并将应用程序保持在已知状态,否则不要捕获异常。

通常,除非可以正确处理,否则不应捕获异常。这可以是MainSomeMethod,具体取决于编码的内容。例如,Main可能包含一般的catch语句来处理一般异常(例如,向控制台写入错误消息);但是SomeMethod可能能够从某些例外中恢复并抓住这些例外。

一般情况下,应避免catch {}(吞咽异常);一个无法处理异常的调用者应该只允许它向上传播。

答案 3 :(得分:1)

没有关于哪一个更好的规则。您可以使用这两种方法。这笔交易是你需要拥有最有可能在try内引发异常的代码,这适用于所有编程语言。

答案 4 :(得分:0)

让我们说下一个发生:

您希望每次失败都有有效的信息。

public void Main()
{
    try
    {
        SomeMethod();
    }
    catch(Exception)
    {
    }
}

上述内容的信息量不如追踪try内的每个SomeMethod(),所以即使如此也没有区别,我建议抓住可能失败的小动作,提供有关的有用数据。错误的原因。

答案 5 :(得分:0)

在我看来,你会在SomeMethod中遇到异常,然后才会出现因为眼睛没有即时的代码可见性而可能会丢失

一个非常重要的事情是请先尝试捕捉特定的异常而不是任何东西

e.g。

如果SomeMethod正在进行一些字符串到数字的转换,那么首先尝试捕获FormatException并将Exception类放到其他任何地方

答案 6 :(得分:0)

我认为,定制将是在最低级别抛出更易理解的异常的最佳方式。

首先定义自定义异常类

public class SomeException : Exception {}

public void SomeMethod()
{
  try
  {
     // code
  }
  catch(Exception e)
  { 
      throw new SomeException ("an error in somemethod",e);
  }
}

现在,你可以在任何地方更清楚地看到异常。