Осведомленность об исключении в блоке finally, но без блока catch [duplicate]

Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:

Случай с краем # 1: одновременный доступ к словарю

Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference или даже (чаще) a KeyNotFoundException при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.

Случай с краем # 2: небезопасный код

Если код NullReferenceException задан кодом unsafe, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.

(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)

4
задан Zamboni 23 August 2010 в 22:31
поделиться

4 ответа

Существует один ужасный взлом с участием Marshal.GetExceptionPointers и Marshal.GetExceptionCode , который не работает на всех платформах:

public static Boolean IsInException()
{
   return Marshal.GetExceptionPointers() != IntPtr.Zero ||
          Marshal.GetExceptionCode() != 0;
}

С этой страницы: http://www.codewrecks.com/blog/index.php/2008/07/25/detecting-if-finally-block-is-executing-for-an-manhandled-exception /

7
ответ дан jdehaan 26 August 2018 в 19:14
поделиться

Я не могу придумать, почему вы не сделали бы это так:

private void Helper(bool exceptionWasCaught)
{
    //...
}
3
ответ дан Hans Passant 26 August 2018 в 19:14
поделиться

Не то, что я знаю. Это громоздко, но он полностью определяет вас как намерение разработчика:

private bool inException = false;

public void MyFunc1()
{
  try
  {
    inException = false;

    // some code here that eventaully throws an exception
  }
  catch( Exception ex )
  {
     inException = true;
     Helper();
  }
}

public void MyFunc2()
{
   inException = false;
   Helper();
}

private void Helper()
{
    // how can I check if program execution is the  
    // result of a thrown exception here.
    if (inException)
    {
        // do things.
    }
}
2
ответ дан Jesse C. Slicer 26 August 2018 в 19:14
поделиться

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

Почему бы вам не изменить подпись метода Helper ()?

public void MyFunc1()
{
  try
  {
    // some code here that eventually throws an exception
  }
  catch( Exception ex )
  {
     Helper(ex);
  }
}

private void Helper(Exception ex = null)
{
    // result of a thrown exception here.
    if (ex!=null)
    {
        // do things.
    } else {
        // do other things
    }
}
0
ответ дан Samuel Renkert 26 August 2018 в 19:14
поделиться
Другие вопросы по тегам:

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