2010-09-30 3 views
0

Я пытаюсь поймать «конкретное» исключение (FormatException^или OverflowException ^), а затем повторно выбросить его и поймать в блоке catch общего исключения (исключение ^).C++ re throw Exception дает ошибку

При запуске я даю ему исключение формата через ввод. Затем я получаю эту ошибку в диалоговом окне: «Необработанное исключение типа« System.FormatException »произошло в FutureValue.exe Дополнительная информация: строка ввода не была в правильном формате». Когда я нажимаю «перерыв» он берет меня к линии № 232.

Вот частичный код:

try 
{ 
... 
} 
catch(FormatException^ ex) 
{ 
     MessageBox::Show("FormatException Occured. Message: " + ex->Message); 
     throw; 
} 
***line# 232*** catch(OverflowException^ ex) 
{ 
     MessageBox::Show("Overflow Occured. Message: " + ex->Message); 
     throw; 
} 
catch(Exception^ ex) 
{ 
     MessageBox::Show("TESTING"); 
} 
+1

Это не C++. Возможно, C++/CLI? –

+0

Я установил тег сейчас. –

ответ

4

Выражение rethrow (throw without assign_expression) вызывает возврат заново заданного объекта. Поскольку исключение уже было обнаружено в области, в которой происходит выражение rethrow, оно возвращается к следующему динамически закрывающему блоку try. Поэтому он не может обрабатываться блоками catch в области, в которой произошло выражение rethrow.

Принимая во внимание вышесказанное, вы можете написать код так:

try 
{ 
    try 
    { 
     //... 
    } 
    catch(FormatException^ ex) 
    { 
      MessageBox::Show("FormatException Occured. Message: " + ex >Message); 
      throw; 
    } 
    catch(OverflowException^ ex) 
    { 
      MessageBox::Show("Overflow Occured. Message: " + ex->Message); 
      throw; 
    } 
} 
catch(Exception^ ex) 
{ 
     MessageBox::Show("TESTING"); 
} 
+0

О, спасибо. Duh. По какой-то причине я думал, что это будет продолжаться после того, как он блокирует блокировку и блокирует блокировки после того, как у него будет возможность поймать повторное исключение. \t Теперь я вижу, что повторное исключение, продолжающееся после самого блока try, к любым последующим блокам try-catch. - –

0

есть подвох блок попробовать над этим?

Вы просто выбросили исключение из инструкции throw, никто не ловит его. Отладчик отправил вас туда, где было исключено исключение

+0

О, спасибо. Duh. По какой-то причине я думал, что это будет продолжаться после того, как он блокирует блокировку и блокирует блокировки после того, как у него будет возможность поймать повторное исключение. –

+0

Теперь я вижу, что повторное исключение, продолжающееся после самого блока try, к любым последующим блокам try-catch. –

+0

На самом деле я совершенно неправ. Вы должны были поймать внешний блок try/catch (исключение) – pm100