Нечетное поведение Try / Catch - PullRequest
5 голосов
/ 12 июля 2010

У меня есть простой блок try / catch

try
{
     // Open the connection
     _connection.Open(); // [1]
}
catch( OracleException ex ) // [2]
{
     // Handle the exception
     int x = ex.ErrorCode;
}

Перехват никогда не выполняется, и среда выполнения выдает сообщение «OracleException is unhandled» в [1], что просто заставляет мою голову вращаться.Ясно, что у меня есть оператор catch для связанного типа исключения.Я даже попробовал полностью определенный тип Oracle.DataAccess.Client.OracleException в [2], и все же исключение не обрабатывается.

Единственный способ, с помощью которого я могу получить улов - это перехват System.Exception в [2].Что вызывает это странное поведение?

Ответы [ 3 ]

4 голосов
/ 12 июля 2010

Вы вообще динамически загружаете сборки, возможно, используете Assembly.LoadFrom или что-то подобное? Если это так, вы можете столкнуться с ситуацией, когда тип, имеющий несколько типов, загружается в различные контексты загрузки.

Сборки, загруженные в разные контексты, представляют одинаковые типы с разными идентификаторами, поэтому они не соответствуют проверкам на равенство типов и т. Д.

С MSDN

  • Контекст загрузки содержит сборки найдено путем исследования: в GAC, в Хост сборки сборки, если среда выполнения размещен или в ApplicationBase и PrivateBinPath приложения домен. Большинство перегрузок нагрузки метод загрузки сборок в этот контекст.

  • Контекст загрузки содержит сборки для которых пользователь при условии, что путь не включен в каталоги искали зондированием. LoadFrom, CreateInstanceFrom и ExecuteAssembly - примеры методы, которые загружаются по пути.

Конечно, это всего лишь предположение, поэтому я могу ошибаться.

2 голосов
/ 12 июля 2010

Возможно, он генерирует исключение Oracle.DataAccess.Client.OracleException вместо Oracle.DataAccess.Client.OracleException.Я знаю, это звучит странно, но возможно иметь два типа с одинаковым именем, загруженные в данный домен приложений.

Попробуйте это ...

try 
{ 
     // Open the connection 
     _connection.Open(); // [1] 
} 
catch( Exception ex ) // [2] 
{ 
     if (ex.GetType() == typeof(OracleException)) Debug.WriteLine("is match");
     else Debug.WriteLine ("is not match");

     // Handle the exception 
     int x = ex.ErrorCode; 
} 

Другая возможность состоит в томисключение обернуто.Возможно, вы получаете InvalidOperationException, который содержит OracleException.

Наконец, ошибка может быть сразу после вашего блока try.Либо вы неправильно прочитали трассировку стека, либо номера строк в трассировке стека неверны.Оба случаются со мной все время.

1 голос
/ 12 июля 2010

Возможно, вы захотите поймать более общий DbException.

try
{
     // Open the connection
     _connection.Open(); // [1]
}
catch( DbException ex ) // [2]
{
     // Handle the exception
     int x = ex.ErrorCode;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...