2012-01-25 2 views
2

Im новое для .Net, и мне интересно, почему этот код по-прежнему вызывает необработанное исключение.Ловля исключений, брошенных при вызове Application.DoEvents()

try 
{ 
    Application.DoEvents(); 
} 
catch 
{ 
} 

У кого-нибудь есть идеи? Этот код вызывается внутри обработчика события. Он выдает исключение NullReferenceException. Самое смешное, когда я пытаюсь поставить точку останова прямо перед этим кодом, исключение не выбрасывается. Исключение происходит только тогда, когда я позволяю коду работать непрерывно.

+1

В коде, который вы показали, есть только две конструкции, а ** оба неверны **. Если вы новичок в .NET, вы явно ошибаетесь. Никогда не пишите код, который выглядит так. –

+0

http://www.codinghorror.com/blog/2005/08/is-doevents-evil-revisited.html вы читаете это :) –

+0

Можете ли вы уточнить? Дело в том, что это не мой код. Это код от какого-то другого парня, и я не совсем уверен, что он здесь делает. Хотя в коде есть что-то не так, не должен ли блок catch обрабатывать исключение «все», которое будет выбрано внутри блока try? –

ответ

1

Не все исключения являются захватывающими. Вы не сказали нам, какое исключение вы видите, но обратите внимание, что StackOverflowException и ExecutionEngineException никогда не могут быть пойманы. Я знаю, что первое может произойти с Application.DoEvents (часто в System.Drawing), но я не уверен в последнем.

В любом случае, ваш код злой. Не проглатывайте исключения. Это означает, что вы глотаете ошибки.

В общем, старайтесь избегать Application.DoEvents. Есть действительно неприятные проблемы с повторным подключением, которые могут произойти.

0

Внимание, что используется Application.DoEvents(), большую часть времени используется для неправильных действий, таких как обновление индикатора выполнения в течение времени, которое можно выполнить с помощью асинхронного программирования. Вы не можете поймать все исключения, пожалуйста, сообщите нам, какое исключение вызывает повышение.

0

Также может случиться так, что при запуске приложения без точки останова DoEvents разрешает выполнение другой части кода и , что код генерирует исключение.

Вы должны проверить StackTrace исключения, чтобы увидеть, где он указывает вас (или опубликовать трассировку стека здесь, и мы можем посмотреть на него). Если это так, вы можете не увидеть исключение, если используете точку останова и шаг, потому что DoEvents и потоки не срабатывают одинаково.

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

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