-1

什么更好,为什么:

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

或这个:

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

7 回答 7

4

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

于 2012-07-18T23:35:32.193 回答
2

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

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

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

学分:诺多林

于 2012-07-18T23:47:42.637 回答
2

有关 C# 中异常处理的指南,请参阅异常和异常处理(C# 编程指南)。 对Anders Hejlsberg 的采访也提供了丰富的信息。

这里的相关指南是:

不要捕获异常,除非您可以处理它并使应用程序处于已知状态。

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

一般catch {}应避免(吞咽除外);无法处理异常的调用者应该简单地允许它向上传播。

于 2012-07-18T23:49:03.123 回答
1

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

于 2012-07-18T23:33:49.767 回答
0

假设接下来会发生:

您希望每次失败都有一条有效消息。

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

上面的信息比捕获每个try内部信息少SomeMethod(),所以即使这样也没有区别,我建议捕获可能失败的小动作,以提供有关错误原因的有用数据。

于 2012-07-18T23:37:58.793 回答
0

在我看来,您在 SomeMethod 超出之前捕获了异常,并且可能由于眼睛上没有立即的代码可见性而丢失

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

例如

如果 SomeMethod 正在做一些字符串到数字的转换,那么首先尝试捕获 FormatException 并将 Exception 类用于其他任何事情

于 2012-07-18T23:44:07.923 回答
0

我认为,自定义将是在最低级别引发更易于理解的异常的最佳方式。

首先定义您的自定义异常类

public class SomeException : Exception {}

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

现在,您将在任何地方更清楚地捕获异常。

于 2012-07-18T23:48:58.323 回答