Обработка исключений в рамках Исключения в C#

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

private void SendMail()
{
    try
    {
        //i try to send a mail and it throws an exception
    }
    catch(Exception ex)
    {
        //so i will handle that exception over here
        //and since an exception occurred while sending a mail
        //i will log an event with the eventlog

        //All i want to know is what if an exception occurs here
        //while writing the error log, how should i handle it??
    }
}

Спасибо.

5
задан Raidri supports Monica 10 June 2014 в 15:17
поделиться

8 ответов

Я бы лично обернул вызов записи в журнал событий еще одним оператором try\catch.

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

4
ответ дан 14 December 2019 в 01:03
поделиться

Учитывая вид исключений при записи в файл (права, диск пространство ...) Я бы посоветовал не трогать это здесь. Если он выйдет из строя в первый раз, есть большая вероятность, что вы не сможете записать в журнал событий то, что невозможно записать в журнал событий ...

Дайте ему всплыть и обработайте его попыткой верхнего уровня. /ловить.

0
ответ дан 14 December 2019 в 01:03
поделиться

Вы можете добавить блок try-catch в свой catch ] также блок.

0
ответ дан 14 December 2019 в 01:03
поделиться

У Криса С. есть лучший ответ. Размещение блока try-catch внутри блока catch очень редко бывает хорошей идеей. и в вашем случае он просто свернет ваш код. Если вы проверите, успешно ли вы записали в файл журнала здесь, вам придется делать это везде, где вы пытаетесь записать в файл журнала. Вы можете легко избежать этого ненужного дублирования кода, если все ваши отдельные модули будут автономными, когда дело доходит до уведомления / обработки ошибок в этих модулях. При сбое отправки почты вы выполняете необходимые действия внутри блока catch для обработки этого исключительного состояния, например:

  1. удаление содержимого вашего почтового объекта
  2. обеспечение закрытия сокета
  3. запись записи в журнал файл, чтобы отметить ошибку

. Внутри вашего блока catch просто вызовите любой API, который вы определили, для записи записи журнала в свой файл журнала и забудьте обо всем остальном. Внутри вашего API журналирования вы должны обрабатывать любые исключительные случаи, связанные с журналированием (диск заполнен, нет разрешения на запись в файл, файл не найден и т. Д.). Вашему модулю рассылки не нужно знать, было ли ведение журнала успешным или нет, эта ответственность должна быть делегирована модулю регистрации.

0
ответ дан 14 December 2019 в 01:03
поделиться

Лично я решаю эту ситуацию с помощью простого метода расширения.

public static class MyExtentions
{
    public static void LogToErrorFile(this Exception exception)
    {
        try
        {
            System.IO.File.AppendAllText(System.IO.Path.Combine(Application.StartupPath, "error_log.txt"),
                String.Format("{0}\tProgram Error: {1}\n", DateTime.Now, exception.ToString()));
        }
        catch 
        { 
            // Handle however you wish
        }
    }
}

Использование простое:

try
{
   ...
}
catch(Exception ex)
{
   ex.LogToErrorFile();
}

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

0
ответ дан 14 December 2019 в 01:03
поделиться

Каждое исключение перехватывается только внутри блока try-catch. Вы можете вложить пробную ловушку, но, как правило, это не лучшая идея.

1
ответ дан 14 December 2019 в 01:03
поделиться
0
ответ дан 14 December 2019 в 01:03
поделиться

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

private void SendMail()
{
    try
    {
        //i try to send a mail and it throws an exception
    }
    catch(Exception ex)
    {
        WriteToLog();
    }
}

private void WriteToLog()
{
    try
    {
        // Write to the Log
    }
    catch(Exception ex)
    {
        // Error Will Robinson
        // You should probably make this error catching specialized instead of pokeman error handling
    }
}
4
ответ дан 14 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: