C # Можете ли вы изучить исключение без отлова? - PullRequest
2 голосов
/ 01 мая 2011

У меня есть некоторый фреймворк / AOP-код, который регистрирует исключения из методов, вызываемых глубже внутри ...

try {
  ..invoke inner code...
}
catch (Exception e) {
  log(e);
  throw;
}

Это прекрасно работает, за исключением одной вещи ... когда моя команда пытается отладить свой код в Studio, они видят только исключение, происходящее в коде регистрации (так как оно обрабатывается, а затем выбрасывается оттуда).

Можно ли как-нибудь заставить Studio игнорировать то, что мой код перехватывает / выбрасывает исключение ... или проверять исключение на его пути, не перехватывая его?

UPDATE: Проблема в том, что у меня есть фреймворк, который предотвращает попадание правильной точки останова для исключения real . Я знаю, что отладчик в visual studio способен к детальной настройке, и я надеюсь, что кто-то здесь сможет предоставить более высокий уровень понимания, чем "Learn VS2010 за 31 час". Я просто хочу, чтобы ОБА регистрировались исключения, вызванные внутренним кодом, И чтобы произошел разрыв на месте ошибки БЕЗ включения «Разрыв всех исключений», что заставило бы мою команду потратить 5 минут, нажав кнопку «Продолжить» каждый раз, когда они запускали приложение (но это уже другая история).

ОБНОВЛЕНИЕ 2: Основной вопрос здесь заключается в том, как я могу зарегистрировать исключение, но отладчик должен останавливаться не на «throw» в моем регистраторе, а на исходном исключении, без остановки отладчика для всех сгенерированных исключений.

Ответы [ 3 ]

2 голосов
/ 01 мая 2011

На самом деле вы можете сделать VS разбить на исключения. Перейдите в меню «Отладка», щелкните «Исключения» и установите оба флажка для «Общих исключений времени выполнения». Теперь вы получите прерывание отладки в тот момент, когда сгенерировано исключение .

1 голос
/ 05 мая 2011

Я немного покопался, и ответ в 1349613 положил мне хороший запах.Я добавил атрибут:

[DebuggerNonUserCode]

В мой класс регистрации.Теперь, когда внутренний вызванный код генерирует исключение, отладчик игнорирует код журнала и его блок Try / Catch и сразу переходит к внутреннему исключению.

0 голосов
/ 04 апреля 2013

В VB.NET можно исследовать исключение, не перехватывая его, и до того, как вследствие этого произойдет какое-либо разматывание стека. Хотя обычно очень опасно делать очень много времени между тем, как было сгенерировано исключение, и временем, когда стек был размотан, можно захватить исключение и затем использовать его в блоке finally. Можно также установить флаг или другой индикатор, чтобы код разматывания стека знал, где будет поймано исключение. К сожалению, полезность последней возможности ограничена из-за (в значительной степени обусловленной языком) антишаблонов кодовых исключений, которые необходимо реагировать на , но не может ожидать разрешения . Например, если исключение выдается в конструкторе после того, как он создал несколько IDisposable объектов и сохранил их в полях, конструктор должен отреагировать на исключение, очистив созданные поля, но не надеется разрешить Ситуация и возвращение нормально. Если бы конструктор мог иметь несколько точек возврата, он был бы семантически более чистым, чем кто-либо мог бы сказать:

try
{
  ... create IDisposables
}
finally(Exception ex)
{
  if (ex != null)
    this.Dispose();
}

чем нужно сказать

try
{
  ... create IDisposables
}
catch(Exception ex)
{
  this.Dispose();
  throw ex;
}

, так как первый избегал перехвата исключения, он не ожидал обработки. Можно написать метод-обертку в VB, который будет принимать пару делегатов и реализовывать второй, используя ту же семантику, что и finally(Exception ex), но, к сожалению, C # не предоставляет такой возможности сам.

...