什么更好,为什么:
:此
public void Main()
{
SomeMethod();
}
public void SomeMethod()
{
try
{
// code
}
catch(Exception)
{
}
}
或者这个:
public void Main()
{
try
{
SomeMethod();
}
catch(Exception)
{
}
}
答案 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也提供了丰富的信息。
此处的相关指南是:
除非您能够处理并将应用程序保持在已知状态,否则不要捕获异常。
通常,除非可以正确处理,否则不应捕获异常。这可以是Main
或SomeMethod
,具体取决于编码的内容。例如,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);
}
}
现在,你可以在任何地方更清楚地看到异常。