Выход из приложения при ошибке в библиотеке C#

Глупый вопрос, признаю. Итак, извините, если это отнимает ваше время, но я просто не могу найти решение.

Приложение WinForm с библиотекой классов. Я использую dll Log4Net для регистрации информации.

На Button_Click я вызываю функцию в библиотеке классов, которая может вызвать ошибку. Итак, у меня есть содержимое функции внутри блока try-catch-finally. В улове я пишу операторы журнала (используя dll Log4Net).

Теперь, когда произошла ошибка, я хочу, чтобы сообщение отображалось в пользовательском интерфейсе. И после того, как показано сообщение, я хочу, чтобы оно было закрыто.

Как передать управление из блока catch библиотеки классов обратно в код формы, чтобы отобразить сообщение, а затем выйти?


person Magic    schedule 11.11.2010    source источник


Ответы (3)


Просто вызовите throw без каких-либо параметров после того, как вы зарегистрируете ошибку в обработчике исключений в библиотеке классов, и он повторно выдаст то же самое исключение с тем же стеком вызовов и т. д.

Затем позвольте вашей форме поймать его и обработать, как вы хотите.

person Hans Olsson    schedule 11.11.2010

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

В форме Button_Click оберните вызов метода класса в try catch, а в catch отобразите сообщение и выйдите.

person Adriaan Stander    schedule 11.11.2010

Библиотека, вероятно, должна повторно выдать исключение после регистрации в журнале.

class Form 
{
    OnClick() 
    {
        try
        {
            library.Routine();
        }
        catch(Exception e)
        {
            // messagebox
            // exit
        }
    }
}

class Library 
{
    public void Routine() 
    {
        try
        {
            // stuff
        }
        catch(Exception e)
        {
            logger.error("error in routine", e);
            throw;
        }
    }
}
person Mike Clark    schedule 11.11.2010
comment
Спасибо! Предположим, что у меня есть два уровня глубины. Форма вызывает ClassLibrary1, которая вызывает ClassLibrary2. Если бы мне нужно было регистрировать ошибку в ClassLibrary2, то в ClassLibrary1 я мог бы только генерировать и не регистрировать в блоке Catch ClassLibrary1. - person Magic; 11.11.2010
comment
@Магия. Я думаю, что это сработает, и это действительно зависит от вас. Большинство моих проектов ведут ведение журнала на нескольких уровнях. В большинстве случаев я стараюсь организовать его достаточно хорошо, так что большую часть времени мои исключения регистрируются только один раз. Тем не менее, во многих случаях я предпочитаю рисковать небольшим избыточным ведением журнала, а не возможностью вообще не получить никакого ведения журнала, поэтому иногда я регистрирую исключение дважды, а иногда даже 3 раза. Как я уже сказал, я стараюсь этого избегать, но на самом деле это зависит от того, кто и для чего использует библиотеки. - person Mike Clark; 11.11.2010