最好的例外情况在哪里?

时间:2011-03-22 05:15:55

标签: c# exception-handling

在Winforms C#应用程序中,在GUI事件方法中捕获异常似乎是一个好主意,例如按钮点击,因为应用程序中的所有用户操作都会开始。

如果我在事件方法中加入try-catch-finally条款,那么我的所有异常都可以被捕获并妥善处理吗?

右?

8 个答案:

答案 0 :(得分:1)

通常,您应该只捕获您知道如何实际处理的异常。你应该尽可能地捕捉到它们发生的位置(因为那时,你知道异常实际意味着什么)。

如果您只是捕获异常以便记录它们(如果这是一个WinForms应用程序),那么我将使用Application.ThreadException事件。

答案 1 :(得分:0)

有几种方法可以做到这一点..

我更喜欢创建我的错误处理程序并从代码中抛出所有异常而不是在该级别捕获它。

请看另一篇关于如何通过Global Handler处理它们的帖子:

Where are exceptions best caught?

答案 2 :(得分:0)

是的,你的确是。但例外是, 将特定异常捕获到一般异常。

[更新] 如果异常来自不同的线程则不会。对了,谢谢“Brian Rasmussen”;)

答案 3 :(得分:0)

捕捉应尽可能靠近投掷源。如果您的按钮单击调用业务层进行某些文件处理,业务层将更好地知道如何从FileNotFoundException恢复而不是按钮单击处理程序。

答案 4 :(得分:0)

请检查http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx

public static void Main(string[] args){
// Add the event handler for handling UI thread exceptions to the event.
Application.ThreadException += new ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);

// Set the unhandled exception mode to force all Windows Forms errors to go through
// our handler.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

// Add the event handler for handling non-UI thread exceptions to the event. 
AppDomain.CurrentDomain.UnhandledException +=
    new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

// Runs the application.
Application.Run(new ErrorHandlerForm());}

答案 5 :(得分:0)

通常情况下,最好的建议是捕获可以最好地处理的异常,并且如果可能的话,通常更有利于捕获它们。

原因是异常表示错误状态,抛出它的代码不知道如何处理(如果确实如此,那么它将处理错误)。举个简单的例子,假设你抛出一个NullReference异常。编码抛出不知道为什么它需要的引用是null。也许它应该是,但代码没有考虑到它。或者也许你的逻辑中出现了一个错误,它将空值传递下去。

在最高级别(UI事件)中捕获所有内容是防止异常暴露给用户的良好后果,但是习惯于这是一种不好的做法,因为它模糊了抛出异常的真正原因并使很难弄清楚应该纠正错误的位置。

答案 6 :(得分:0)

try块将对try块中的代码抛出的任何未捕获的异常进行操作。这包括您调用的方法,这些方法调用的任何方法,等等。如果从这些方法中抛出异常,它将会“冒出来”#34;通过程序,打破循环,方法等,直到它到达最后一个(即最深的)try块来封闭它。

你可以说,从你进入试用区块到你离开它的时间,任何例外情况都会立即突破试验并有机会由它处理(除非它们被其他人抓住)尝试嵌套在里面的块)。

所以要回答你的问题,如果你知道在事件处理程序内部(或从事件处理程序内部调用的方法)中会发生任何异常,那么将整个事物包装在try-catch-finally块中将会捕获任何异常异常(假设无类型捕获)。

这是一个好主意是一个设计问题。它通常不是。您通常希望将错误处理程序放在可能引发错误的位置。但是,如果不了解您的情况或代码,很难就此类设计细节向您提供任何建议。

答案 7 :(得分:0)

不要忘记AppDomain.UnhandledException。在进行中央异常处理时,我也经常处理这个问题。