定制异常处理程序

时间:2012-03-21 13:59:25

标签: c# exception

我需要编写自定义异常处理程序...

我的应用程序可能会抛出不同类型的异常,我希望它们都由一个处理程序处理(这样我就不需要使用数千个“try-catch”块)。

我尝试使用AppDomain的UnhandledException处理程序,但似乎在捕获异常时,应用程序将不可避免地被关闭。

那么,有什么方法可以实现我的想法吗?

编辑:

感谢您的快速回复,但我想让您更好地理解我的情况:例如,我有一个抛出自定义异常的类(可逆)。现在,这个类被多个其他类调用,所以我需要在每个类中编写一个try-catch块(或者至少这是你的回复让我想到的)..

所以,需要有一个能够捕获它们的处理程序......

5 个答案:

答案 0 :(得分:3)

您应该捕获特定的例外,代码中您能够最好地处理它们。这不应该导致成千上万的try-catch块,相反,你应该找到异常处理的本地化区域。

我倾向于在服务边界处理异常,例如,在与数据库或文件系统交互时。在这些服务边界,您可以处理异常并执行一些逻辑恢复。

如果您发现自己编写了try-catch块,其中catch不会增加值,无法帮助您的代码恢复,那么您不会通过捕获异常来增加值!

答案 1 :(得分:1)

你不应该需要'成千上万'的try / catch块。

只有在你可以做出决定的地方才能理解你的理解。

捕获异常是你的逻辑的一部分(与try / finally不同),并且使用1个中央处理程序通常不会这样做。

将此视为研究正当使用例外的机会。

答案 2 :(得分:1)

您可以在不关闭应用程序的情况下使用AppDomain的UnhandledException处理程序。我也记录错过的异常:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Program_UnhandledException);

private static void Program_UnhandledException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
    //Handle the exception here...
}

但我同意其他答案,通常你不需要捕获所有异常处理程序。处理发生异常的行为应该是首选行动。

编辑:我不知道它在控制台应用程序中的工作方式是否相同。

答案 3 :(得分:0)

将代码包装在try和catch块中,捕获异常。所有异常都是从Exception派生的,因此抛出并在其他地方未处理的每个异常都会在此处捕获。但请记住,如果抛出异常,您将处理应用程序可能的无效状态。在异常之后,您不能总是继续。 另一种相当直接的方法是注册Application.ThreadException(WinForms),但如果您计划继续运行应用程序,则不应再使用此方法。这适用于您想要显示消息的情况,也许是发送错误报告然后关闭应用程序的方法。

答案 4 :(得分:-3)

try
{
    // Code that needs exception handling
}
catch (Exception ex)
{
    // Handle exception. You may use ex.GetType()
}

如果这还不够,请在您的问题中解释原因。