什么更好,为什么:
这
public void Main()
{
SomeMethod();
}
public void SomeMethod()
{
try
{
// code
}
catch(Exception)
{
}
}
或这个:
public void Main()
{
try
{
SomeMethod();
}
catch(Exception)
{
}
}
什么更好,为什么:
这
public void Main()
{
SomeMethod();
}
public void SomeMethod()
{
try
{
// code
}
catch(Exception)
{
}
}
或这个:
public void Main()
{
try
{
SomeMethod();
}
catch(Exception)
{
}
}
答案是:“在知道如何处理它的最低级别捕获异常。”
有一个想法是,您应该在最接近它们发生的位置捕获异常(即尽可能/适当地在调用堆栈的高处)。一揽子异常处理程序通常不是一个好主意,因为它大大减少了您可用的控制流。粗粒度异常处理非常重要,但不是程序稳定性的合理解决方案。不幸的是,许多初学者开发人员认为是这样,并采取了这种笼统的 try-catch 语句这样的方法。
话虽如此,如果您在程序的其余部分中正确地使用了异常处理(以细粒度和特定于任务的方式),并在那里相应地处理了错误(而不仅仅是显示通用错误框),那么一般尝试-catch 在 Main 方法中的所有异常可能是一个有用的东西。这里要注意的一点是,如果你在这个 Main try-catch 中发现了 bug,那么你要么有 bug,要么你的本地化异常处理有问题。
这个 try-catch 与 Main 的主要用途纯粹是为了防止您的程序在非常不寻常的情况下崩溃,并且应该只向用户显示(模糊)用户友好的“致命错误”消息,或者只是留空,以及可能在某处记录错误和/或提交错误报告。
学分:诺多林
有关 C# 中异常处理的指南,请参阅异常和异常处理(C# 编程指南)。 对Anders Hejlsberg 的采访也提供了丰富的信息。
这里的相关指南是:
不要捕获异常,除非您可以处理它并使应用程序处于已知状态。
通常,除非可以正确处理,否则不应捕获异常。这可能是Main
或SomeMethod
,具体取决于编码的内容。例如,Main
可能包含一个通用的 catch 语句来处理通用异常(例如,向控制台写入一条错误消息);但SomeMethod
可能能够从某些异常中恢复并捕获这些异常。
一般catch {}
应避免(吞咽除外);无法处理异常的调用者应该简单地允许它向上传播。
没有关于哪个更好的规则。您可以使用这两种方法。交易是您需要拥有最有可能在内部引发异常的代码,try
这适用于所有编程语言。
假设接下来会发生:
您希望每次失败都有一条有效消息。
public void Main()
{
try
{
SomeMethod();
}
catch(Exception)
{
}
}
上面的信息比捕获每个try
内部信息少SomeMethod()
,所以即使这样也没有区别,我建议捕获可能失败的小动作,以提供有关错误原因的有用数据。
在我看来,您在 SomeMethod 超出之前捕获了异常,并且可能由于眼睛上没有立即的代码可见性而丢失
一件非常重要的事情是请尝试首先捕获特定的异常而不是任何东西
例如
如果 SomeMethod 正在做一些字符串到数字的转换,那么首先尝试捕获 FormatException 并将 Exception 类用于其他任何事情
我认为,自定义将是在最低级别引发更易于理解的异常的最佳方式。
首先定义您的自定义异常类
public class SomeException : Exception {}
public void SomeMethod()
{
try
{
// code
}
catch(Exception e)
{
throw new SomeException ("an error in somemethod",e);
}
}
现在,您将在任何地方更清楚地捕获异常。