2015-01-29 2 views
1

Моя программа генерирует System.ComponentModel.Win32Exception внутри блока try/catch и исключение не попадает. Код очень прост:Try/Catch Block Fails to Catch Exception

try 
{ 
    lAFE.MinimumSize = sz1; // lAFE=Label, sz1 = Size 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("afe: " + ex.Message); 
} 

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

Что может привести к тому, что подобное исключение не будет обнаружено.

Это приложение использует много памяти, и исключение всегда возникает, когда использование памяти достигает около 305 КБ.

Любые советы были бы весьма полезными.

+0

Какое исключение? – Sievajet

+1

Удалите часть Exception ex'. Только «catch {your stuff}» для собственных исключений. –

+3

Возможный дубликат [Почему исключение win32 не попадает в механизм обработки исключений C#] (http://stackoverflow.com/questions/1205426/why-win32-exception-are-not-caught-by-c-sharp-exception- механизм обработки) –

ответ

4

Поскольку исключения Win32 не относятся к классу .NET Exception. Попробуйте:

try 
{ 
} 
catch (Exception ex) 
{ 
    // .NET exception 
} 
catch 
{ 
    // native exception 
} 

Вы можете прочитать article:

Улов блок, который обрабатывает исключение ловит все Common Language Specification (CLS) совместимые исключения. Однако он не улавливает исключения, не связанные с CLS. Исключениями, не совместимыми с CLS, могут быть , выброшенные из собственного кода или из управляемого кода, который был сгенерирован ассемблером промежуточного языка Microsoft (MSIL) . Обратите внимание, что компиляторы C# и Visual Basic не разрешают исключить исключения, отличные от CLS , а Visual Basic не улавливает исключения, отличные от CLS . Если целью блока catch является обработка всех исключений , используйте следующий общий синтаксис блока catch.

C#: поймать {}

+0

Я не уверен, что это решит проблему, op явно заявляет, что он получает 'System.ComponentModel.Win32Exception' –

+0

Когда я пробовал то, что вы предложили выше, компилятор жаловался на второй улов, заявляя, что предыдущий улов уже ловит ВСЕ исключения. – DPB

0

Является ли этот код работать в другом потоке/задачи/метод асинхронной?

Вот пример некоторых видов исключений, которые «не могут» быть пойманы.

UnmanagedFunctionPointer causes stackoverflow when using .NET 4.0, 3.5 works

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

Можете ли вы опубликовать еще какой-то контекст того, как этот метод вызывается? Я обновлю этот ответ.