使用单个异常处理程序向应用程序添加进一步的异常处理

时间:2011-09-15 16:39:24

标签: .net winforms design-patterns exception-handling

我刚刚使用

创建了一个桌面应用程序

技术:

  • MEF
  • EF
  • 的WinForms

模式:

  • MVVM
  • 的IoC
  • 的UnitOfWork
  • 存储库模式

现在我需要添加异常处理机制,目前我的应用程序没有尝试捕获除Main()之外的任何地方。我把try catch放在哪里,并在Global异常处理程序(ApplicationThreadException)中处理所有类型异常。但这不是处理异常的正确方法。

那么任何想法或任何图书馆或任何可以帮助我处理异常的东西?

5 个答案:

答案 0 :(得分:4)

  

所以任何想法或任何图书馆或任何可以帮助我处理的东西   异常?

我认为,在众所周知的马闩上后,你试图关上谷仓门。

异常处理并不是事后可以轻易搞定的。在构建应用程序时应考虑异常处理。对于您编写的每个功能代码单元,您应仔细考虑是否可以生成异常,如果是,请确定处理它们的适当位置。当然,你可以插入没有神奇的图书馆。

  

现在我需要添加异常处理机制,目前是我的   应用程序没有尝试捕获除Main()之外的任何地方。我把它放在哪里   尝试catch,并在Global异常中处理所有类型异常   处理器(ApplicationThreadException)。但这不是正确的方法   处理异常。

main中捕获所有例外情况时,您(目前为止)已决定您的应用不需要在任何其他级别处理它们。实际情况是这样的吗?问问自己,你的应用程序目前是否运行良好,并且在没有经常出错的情况下做了它应该做的事情。 真的是否需要添加所有异常处理代码?

  • 如果您的应用现在运行良好并且您没有发现任何问题,那么答案可能是:您已经获得了当前所需的所有异常处理。

  • 但是,如果您的应用程序出现问题并且经常因main()中出现异常或其他问题而失败,并且您正在考虑整个应用程序不应该因为在可恢复的错误中,您已经确定了其他地方的异常处理案例,您应该返回并确定各个失败案例并在应用程序的适当级别处理它们。

答案 1 :(得分:3)

只有应用程序的操作逻辑才能告诉你在哪里使用try / catch。

如果你能在异常的情况下做某事 - 那么你就把声明放在那一点上。如果在整个应用程序中你不觉得你需要异常处理,因为你无法对它们做任何事情 - 最外面的捕获器是你的异常处理的好地方,但只会用于记录目的。

答案 2 :(得分:1)

连接事件处理程序以处理应用程序中任何位置的未处理异常,然后不在main中使用try / catch。

在你的Main()中试试这个:

    //Wire up handling of all unhandled exceptions
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

    //Handle the events
    static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
        HandleException(e.Exception);
    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        HandleException((Exception)e.ExceptionObject);
    }

    public static void HandleException(Exception e)
    {
         //Do something with the exception stored in e.
         //Email an admin, show the user a pretty message, show the user a detailed stack trace only if they click Show Details, etc.  

    }

答案 3 :(得分:0)

我总是使用这段代码:

public static void HandleException(Exception  e)
        {
            string s="Message= "+e.Message +"\n";
            s+="Source= "+e.Source +"\n";
            s+="Stack Trace= "+e.StackTrace+"\n";
            Exception inner=e.InnerException;
            MessageBox.Show(s);
            while(inner !=null)
            {
                string ss="Message= "+inner.Message +"\n";
                ss+="Source= "+inner.Source +"\n";
                ss+="Stack Trace= "+inner.StackTrace+"\n";
                MessageBox.Show(ss);
                inner=inner.InnerException;


            }
        }

答案 4 :(得分:-1)

你的方式肯定是不合适的,因为你远离它抛出的点捕获异常。你的全局捕获最终会记录但无法做出反应。

想象一下,在操作它之前尝试在某个文件夹中创建文件的情况,如果文件夹不存在并且您首先创建文件夹然后在其中创建文件,则可能是您决定捕获异常。在Main方法为时已晚,因为你无法做任何事情,你可以记录是但你不能创建文件夹,即使你这样做,程序也不会从正确的点继续。

这是对于为什么要进行适当的异常处理的简单介绍,只是非常多的一个例子...只需将你的try catch放到需要的地方并对异常做出反应(处理它们)或抛出它们(有时从内部抓住。有时候完全忽略了catch条款......你应该读一些关于这个的文章。