2009-12-16 2 views
4

Когда в вашей программе (в отладчике) возникает непредвиденное исключение. Иногда вы просто хотите пропустить его, поскольку убийство программы в этот момент более опасно, чем продолжение. Или вы просто хотите продолжить, так как вас больше интересует другая ошибка/ошибкаЕсть ли способ продолжить исключение в C#?

Есть ли опция/compilerflag/secretswitch, чтобы включить это?

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

ответ

6

Вы не можете сделать это без соответствующего блока catch в своем коде, нет. Тем не менее, я не помню, чтобы когда-либо захотелось это сделать: если возникает исключение, которое ваш код не знает, как правильно обращаться, зачем вы хотите продолжить? В этот момент вы находитесь в плохом состоянии - продолжать было бы опасно.

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

+0

Я тоже наткнулся на это - если первое исключение не важно для проблемы, которую вы действительно отлаживаете, вы можете продолжить. В этом случае вы можете сбросить состояние справа до исключения и затем пропустить шаг, который генерирует исключение. Это может стать намного проще с временной отладкой в ​​VS 2010 :) В общем, однако, вы правы, вам все равно придется обрабатывать первое исключение, рано или поздно. – OregonGhost

+0

@jon: очень правильно .... все же у меня была эта ошибка, которая происходила только в производственной среде. Поэтому я подключил отладчик ... и да было исключение, которое не было. И это даже не было большой сделкой, поэтому я бы предпочел, чтобы сначала делал это правильно, а затем чисто остановил программу, исправив исключение, и вернул ее. – Toad

+0

@oregon: yes ... тот факт, что отладчик поймал его ... указывает на то, что программа все еще плавает вокруг ... и возможно, это позволит продолжить. (точно так же, как у утверждений была эта опция) – Toad

2

Используйте примерку поймать блок, и при ловле, дон ничего не делайте об исключении.

+1

Это не сработает. Попробуйте без catch или, наконец, недействительно, и блок try/catch, который ничего не делает, не продолжит выполнение в следующей строке в try

1

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

+0

Это работает, если исключение уже произошло, и меня выбрали в отладчике? – Toad

+0

Нет, только если вы запустили приложение из отладчика, если оно исходит от JIT, тогда это невозможно. – jmservera

1

При переходе через код в режиме отладки вы можете пропустить выполнение инструкций, которые вызывают нежелательное исключение. Но если исключение уже выбрано, и у вас нет try/catch, он будет распространяться.

0

Посмотрите на Exception Handling Application Block и соответствующую документацию. Он содержит рекомендации по обработке исключений приложений, и для вас существует много кода фреймворка, то есть для ведения журнала.

0

Если вы хотите знать, какое исключение вы хотите разрешить. то вы можете сделать это ниже

try 
{ 
     // your functionality 
} 
catch(Exception ex) 
{ 
    // Catch only the exceptions you need to point out 
} 
finally 
{ 
    //do what you want to complete with this function. 
} 
+0

да Я знаю, как поймать исключение. Мой вопрос заключается в том, что одно исключение, которое бросается, но которое я забыл поймать, и отладчик ловит его ... этот, я хочу продолжить, но я не могу – Toad

+0

МОЖЕТЕ ЛИ ВЫ СКАЗАТЬ МНЕ, ЧТО ИСКЛЮЧИТЕЛЬНОЕ ДЕБЮГГЕР ПОКАЖЕТ, И КОТОРАЯ ЧАСТЬ CODE WITHE FEW LINES OF YOUR CODE – solairaja

+0

если исключение находится в коде, меня можно исключить. наверняка. – solairaja

0

Я полагаю, что «пропуск» вы имеете в виду, что вы хотите, чтобы ваша программа, чтобы продолжить работу после исключения. Это, конечно, возможно, если вы поймаете исключение при использовании блока try-catch.

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

поймать (Exception е) {}

везде в источнике не приведет к стабильному применению;)

Если ваша проблема более отладчик, связанной с (вы не хотите, чтобы отладчик останавливался на каждом исключении), тогда есть место в VS, где вы можете это изменить:

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

+0

да Я знаю, как поймать исключение. Мой вопрос заключается в том, что одно исключение, которое бросается, но которое я забыл поймать, и отладчик ловит его ... этот, который я хочу продолжить, но я не могу – Toad

+0

, вы имеете в виду, что у вас есть приложение в вашей производственной среде, и вы теперь у меня нет доступа к изменению источника. Вы хотите заставить его работать, просто пропуская это исключение? Если это так, хммм. Не уверен, что вы можете сказать виртуальной машине «не выбрасывать это исключение» ... – Danail

+0

danail: исключение уже выбрано, и отладчик поймал его ... Единственное, что я могу сделать сейчас, это просмотреть некоторые переменные и выйти из приложения/отладчика. Я бы хотел (в случае глупого исключения, которое в любом случае не имеет значения), чтобы продолжить программу (начиная со следующей строки/блока) – Toad

Смежные вопросы