Как определить, выполняется ли программа по сгенерированному исключению во время выполнения? - PullRequest
4 голосов
/ 24 августа 2010

Могу ли я обнаружить во время выполнения внутри метода Helper (), что выполнение программы является результатом сгенерированного исключения?

Обратите внимание, моя цель состоит в том, чтобы не расширять метод Helper () для получения объекта исключения в качестве входного параметра.

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

public void MyFunc2()
{
   Helper();
}

private void Helper()
{
    // how can I check if program execution is the  
    // result of a thrown exception here.
}

Ответы [ 4 ]

7 голосов
/ 24 августа 2010

Существует один ужасный хак с 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/

4 голосов
/ 24 августа 2010

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

private void Helper(bool exceptionWasCaught)
{
    //...
}
2 голосов
/ 24 августа 2010

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

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.
    }
}
1 голос
/ 01 ноября 2016

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

Почему вы не хотите изменить сигнатуру метода 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...