Добавление дополнительной обработки исключений в приложение с помощью одного обработчика исключений - PullRequest
1 голос
/ 15 сентября 2011

Я только что сделал одно настольное приложение, используя

Технология:

  • MEF
  • EF
  • WinForms

Шаблоны:

  • MVVM
  • IoC
  • UnitOfWork
  • Шаблон репозитория

Теперь мне потребовалось добавить механизм обработки исключений, в настоящее время мое приложение не имеет функции try catch нигде, кроме Main (). Куда я положил try catch, и обработал все типы исключений в глобальном обработчике исключений (ApplicationThreadException). но это неправильный способ обработки исключения.

То есть какие-нибудь идеи или какая-либо библиотека или что-нибудь, что может помочь мне в обработке исключений?

Ответы [ 5 ]

4 голосов
/ 15 сентября 2011

Так что любые идеи или любая библиотека или что-нибудь, что может помочь мне для обработки исключение?

Я думаю, что вы пытаетесь закрыть дверь сарая после того, как пресловутая лошадь заперлась.

Обработка исключений - это не то, что вы легко можете использовать в качестве запоздалой мысли. Следует учитывать обработку исключений при создании приложения. Для каждой функциональной единицы кода, которую вы пишете, вы должны тщательно продумать, могут ли генерироваться исключения и, если это так, определить подходящее место для их обработки. Конечно, нет волшебной библиотеки, которую можно просто подключить.

Теперь мне нужно добавить механизм обработки исключений, в настоящее время мой Приложение не должно пытаться поймать нигде, кроме как в Main (). Где я положил попробуй поймай, и обработал все типы исключений в глобальном исключении Обработчик (ApplicationThreadException). но это не правильный способ обработать исключение.

Улавливая все исключения в main, вы (до сих пор) приняли решение, что вашему приложению не нужно иметь дело с ними на каком-либо другом уровне. Это действительно так? Спросите себя, хорошо ли работает ваше приложение в настоящее время и выполняет ли оно то, что должно делать, не выполняя постоянно ошибки. Вам действительно нужно добавить весь этот код обработки исключений?

  • Если ваше приложение работает хорошо и вы не видите никаких проблем, то ответ, вероятно, нет: вы уже получили всю обработку исключений, которая вам нужна в данный момент.

  • Однако, если ваше приложение содержит ошибки и регулярно выходит из строя, за исключением тех или иных исключений или других ситуаций, попадающих в main(), и вы думаете, что все приложение не должно выйти из строя только из-за исправимой ошибки, тогда вы Вы обнаружили случай обработки исключений в другом месте, и вам следует вернуться и определить отдельные случаи сбоев и устранить их на соответствующем уровне в вашем приложении.

3 голосов
/ 15 сентября 2011

Только логика работы вашего приложения говорит вам, где использовать try / catch.

Если вы можете что-то сделать в случае исключения - тогда вы помещаете утверждение в этот момент.Если во всем приложении вы не чувствуете, что нуждаетесь в обработке исключений, потому что вы ничего не могли с ними поделать - внешний ловец - это хорошее место для обработки исключений, но он будет служить только целям регистрации.

1 голос
/ 15 сентября 2011

Подключите обработчики событий для обработки необработанных исключений в любом месте вашего приложения, а затем не используйте try / catch в main.

Попробуйте это в вашем 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.  

    }
0 голосов
/ 16 сентября 2011

Я всегда использую этот код:

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;


            }
        }
0 голосов
/ 15 сентября 2011

Ваш путь, безусловно, неправильный, потому что вы ловите исключение далеко от того места, где оно было брошено. И ваш глобальный улов может в конечном итоге войти, но не может реагировать.

Представьте себе ситуацию, когда вы пытаетесь создать файл в определенной папке, прежде чем манипулировать им, может случиться так, что вы решите перехватить исключение, если папка не существует, и вы сначала создаете папку, а затем создаете файл в ней. В методе Main слишком поздно, потому что вы ничего не можете сделать, вы можете войти да, но вы не можете создать папку, даже если вы это сделаете, программа все равно не продолжит работу с нужной точки.

Это очень смутное введение в то, зачем делать правильную обработку исключений, просто пример из очень многих ... просто поместите свой пробный улов везде, где это необходимо, и либо отреагируйте на исключение (обработайте их), либо бросьте их (иногда изнутри поймать. иногда пропускаю предложение catch) ... я думаю, вам следует прочитать некоторые статьи по этому поводу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...