Как НЕ взломать на исключение?
У меня есть что-то вроде этого:
try
{
instance.SometimesThrowAnUnavoidableException(); // Visual Studio pauses the execution here due to the CustomException and I want to prevent that.
}
catch (CustomException exc)
{
// Handle an exception and go on.
}
anotherObject.AlsoThrowsCustomException(); // Here I want VS to catch the CustomException.
В другой части кода у меня есть несколько ситуаций, когда выбрасывается CustomException. Я хотел бы заставить Visual Studio прекратить ломать строку instance.SometimesThrowAnUnavoidableException(), поскольку она затеняет обзор других мест, где меня интересует нарушение CustomException.
Я попытался DebuggerNonUserCode, но это для другой цели.
Как отключить Visual Studio от перехвата определенного исключения только определенным способом?
5 ответов
Вы можете использовать пользовательский код, чтобы сделать это в два этапа.
- Отключить автоматический взлом на
CustomException
исключение. - Добавить обработчик для
AppDomain.FirstChanceException
событие для вашего приложения. В обработчике, если фактическим исключением являетсяCustomException
проверьте стек вызовов, чтобы увидеть, действительно ли вы хотите прерваться. - Использовать
Debugger.Break();
вызвать Visual Studio, чтобы остановить.
Вот пример кода:
private void ListenForEvents()
{
AppDomain.CurrentDomain.FirstChanceException += HandleFirstChanceException;
}
private void HandleFirstChanceException(object sender, FirstChanceExceptionEventArgs e)
{
Exception ex = e.Exception as CustomException;
if (ex == null)
return;
// option 1
if (ex.TargetSite.Name == "SometimesThrowAnUnavoidableException")
return;
// option 2
if (ex.StackTrace.Contains("SometimesThrowAnUnavoidableException"))
return;
// examine ex if you hit this line
Debugger.Break();
}
В Visual Studio перейдите в раздел отладки-> исключения и отключите прерывание для вашего CustomException
сняв соответствующий флажок, затем установите точку останова в коде (возможно, на catch
заявление) на местах, на которые вы действительно хотите прорваться.
Если вы хотите, чтобы Visual Studio перестала нарушать все исключения типа, вам нужно настроить поведение из окна Исключения.
Здесь есть полные инструкции, но суть в том, чтобы перейти в меню "Отладка" и выбрать исключения, а затем снять флажки с тех пунктов, которые вы не хотите, чтобы отладчик включал.
Я не думаю, что есть способ избежать определенного метода, использующего эту технику, но, возможно, лучший вопрос - "почему это вызывает исключение?"
Вы можете добавить набор инструкций препроцессора #IF DEBUG, чтобы избежать проблемных участков кода.
Вы можете полностью отключить пошаговое выполнение, поместив атрибут DebuggerStepThrough перед методом. Поскольку это отключает пошаговое выполнение всего метода, вы можете изолировать try-catch в отдельный для целей отладки.
Я не проверял, но он не должен даже ломаться в этом методе, когда вызывается исключение. Дай попробовать;-)
Смотрите также эту тему
Вы не можете просто отключить Visual Studio от остановки в определенном месте кода. Вы можете предотвратить его остановку только при возникновении определенного типа исключения, но это повлияет на все места, где такое исключение возникает.
На самом деле вы можете реализовать собственное решение, как предложено Sam Harwell.