Отладчик уведомляется об исключении только в том случае, если он подключен. Например, если вы выполняете отладку в Visal Studio, то она будет вызываться первым, и если она будет передана в исключение, будут вызваны обработчики исключений. Чтобы отключить отладчик во всех исключениях, из Visual Studio выберите меню «Отладка» и выберите «Исключения», а затем выберите исключения, в которых вы хотите, чтобы отладчик остановился. Если ни один из этих обработчиков (или нет обработчиков), отладчик будет вызван в 2-й раз, чтобы остановить выполнение, и отобразит общее сообщение о том, что произошло исключение. Если, с другой стороны, отладчик не подключен, отладчик не будет уведомлен, что соответствует 99% + всего управляемого производственного кода.
Векторная обработка исключений - это api низкого уровня, предназначенная для использования из неуправляемого кода - то есть C++. Ваш первый выбор из управляемого кода (C#) должен заключаться в использовании структурированной обработки исключений с блоками try/catch/finally. Большинство (99% +) разработчиков кода, использующих язык C#, включая меня, обнаружили, что обработка структурированных исключений вполне адекватна.
Если вы все еще думаете, что вам нужно использовать этот api, вам придется вызвать AddVectoredExceptionHandler, используя P/Invoke, который может быть вызван одним способом неуправляемым кодом из управляемого кода. Есть пара предостережений. См. Эту ссылку для общего overview. Mike Stall's blog предлагает избегать векторных исключений в управляемом коде. В this thread Майк Столл говорит, что неуправляемые обработчики исключений векторных данных никогда не должны переходить в управляемый код. Он также предлагает, что управляемые исключения являются недокументированной функцией в обработке векторных исключений и что MS может устранить эту поддержку в будущей версии CLR, поэтому используйте свою собственную угрозу.
AppDomain.UnhandledException event вызывается только в том случае, если другой обработчик не найден. Его можно использовать в ситуациях, когда требуется зарегистрировать некоторую информацию об необработанном исключении, но мало времени для правильной структурированной обработки исключений для большой базы существующего кода или, возможно, у вас нет доступа к коду что бросает исключение. В противном случае вместо этого следует использовать блоки try/catch/finally.
Вы также можете попробовать взглянуть на AppDomain.FirstChanceException event, который встречается до вызова первого обработчика исключений. Это может быть полезно, если все, что вы хотите сделать, - это зарегистрировать некоторую информацию для определенных исключений, брошенных в чужой код, к которому у вас нет доступа. Это только уведомление, но не обработчик исключений. Я никогда не использовал его раньше, поэтому не знаю, насколько это может повлиять на производительность. Меня беспокоит то, что разработчики Microsoft иногда бросают исключения в CLR для разных вещей, кроме истинных ошибок. Чтобы увидеть это в действии, попробуйте отключить отладчик для каждого исключения, включая исключения среды CLR Runtime. Это можно сделать в Visual Studio из меню Debug и выбрать Exceptions.Таким образом, я не знаю, какое влияние это окажет на производительность, поскольку все исключения CLR, вероятно, также поднимут это событие. Справедливости ради следует отметить, что последний раз я делал это с VS 2008. Это может быть неверно или верно для более поздних версий CLR. Я не вижу способа ограничить исключения, которые это событие будет срабатывать. Таким образом, вам нужно будет отфильтровать те исключения, которые вам не интересны, и экспериментировать, чтобы определить его влияние на производительность.
Событие 'UnhandledException' - это просто нормальное событие. Это связано с обработкой исключений только потому, что .NET вызывает это событие, когда возникает необработанное исключение. –
@JohnSaunders, поэтому вы имеете в виду, что в некотором смысле код, который испускает clr, не делает вызов методу RaiseException, когда что-то не получается внутри блока try? –
Какой код выдает clr? Вы имеете в виду '+ = (x, y) => что угодно? Правильно. Это всего лишь стандартный код обработки событий. Ничего особенного. В .NET почти ничего особенного нет. –