Журнал внешних, но не собственных сборок исключений первого шанса - PullRequest
1 голос
/ 16 января 2012

Ловить самостоятельно Исключения из первого шанса

AppDomain.CurrentDomain.FirstChanceException += FirstChanceException;

private static void FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
    {
        // I would like to log exceptions happening outside my assembly?
        // But this event does not receive external FirstChanceExceptions
        // (unlike Visual Studio debug output)
        myLogger.Log(e.Exception);
    }

Пример

  • Я хотел бы войти A first chance exception of type 'System.IO.IOException' occurred in WindowsBase.dll

  • Но не лог A first chance exception of type 'System.DivideByZeroException' occurred in MyApp.exe

Решение

  • Есть ли способ получить уведомление о тех исключениях, возникающих в dll, как mscorlib.dll?
  • Обратите внимание, что интерес заключается в том, чтобы войти в производственную версию, а не только в отладку.

Почему

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

Например, из-за исключения значение null может быть возвращено из внешнего метода (вместо того, чтобы возвращать желаемый вывод x ), и хотя мой код в основном обрабатывает такие ненормальный вывод полезно знать, что именно пошло не так и где - потому что, хотя я могу избежать фатальных исключений, чаще всего значение null делает часть моего приложения неработоспособной. Поэтому регистрация внешнего исключения первого шанса предоставит ценную информацию, которая поможет исправить проблему / превратить null в x . И это может присутствовать только в определенных средах / для конкретных пользователей и т. Д ...

1 Ответ

2 голосов
/ 16 января 2012

Вы можете использовать StackTrace класс, чтобы проверить, что является источником исключения:

var stackTrace = new StackTrace(e.Exception);
var sourceFrame = stackTrace.GetFrame(0);
var throwingMethod = sourceFrame.GetMethod();
var sourceAssembly = throwingMethod.DeclaringType.Assembly;
var assemblyName = sourceAssembly.GetName().Name;

bool isMyApp = assemblyName == "MyApp";
...