Как я могу уловить внутреннее исключение в .NET? Мне нужно проверить 2 базы данных для записи. Код базы данных генерирует исключение, если запись не найдена, поэтому я хочу проверить вторую базу данных:
Try
# Code to look in database 1
Catch ex as DataServiceQueryException
Try
# Code to look in database 2
Catch ex2 as DataServiceQueryException
throw New DataServiceQueryException(ex.Message, ex2) # Fails here
End Try
Catch ex as Exception # Why doesn't ex2 land here?
# Tell user that data was not found in either database
End Try
Вышеупомянутый псевдокод не работает в 'Fails here
, а ex2 никогда не обрабатывается моим кодом.
Как правильно обработать внутреннее исключение?
Причина, по которой ваш текущий код не работает, заключается в том, что как только вы входите в секцию catch, вы уже покинули блок try. Вместо этого сделайте следующее:
Try
''# Check Database 1
Catch
Try
''# Check Database 2
Catch
''# Tell the user that data was not found in either database
End Try
End Try
Или вот так:
Dim FoundFlag as Boolean = False
Try
''# Check Database 1
FoundFlag = True
''# Best if you can just return "False" and avoid the exception altogether
Catch
End Try
If Not FoundFlag Then
Try
''# Check Database 2
FoundFlag = True
Catch
End Try
End If
If Not FoundFlag Then
''# Tell the user that data was not found in any database
End If
Внутреннее исключение по определению уже обработано и переупаковано как другое исключение. Вы должны обработать внешнее исключение, а затем, если необходимо/соответствующий процесс, внутренний в блоке catch внешнего исключения.
Catch ex as Exception
. Я думал, что внутреннее исключение будет просто поймано внешним Catch
.
Во-первых, если вы используете try/catch, вы, вероятно, должны, наконец, очистить ресурсы. При этом, если вложенные try/catch блокируют нас, как правило, запах кода. Вы должны реализовать его таким образом? Почему сервер просто терпит неудачу? Почему Data Layer не смог передать сообщение статуса? Исключения должны быть, ну, "исключительными".
Если вам нужно использовать исключения, "Joel Coehoorn" кажется хорошим.
Я согласен с Джоэлом, и я хотел бы далее рекомендовать вам сесть и решить, какие из следующих случаев вы действительно хотите, а затем соответствующим образом кодировать.
Случай А. Если запись11 существует в db1 затем проверьте, существует ли запись22 в db2
try{
getRecord11;
try
{
getRecord22;
}
catch ex22
{
saySorry2;
}
}
catch ex11
{
saySorry1;
}
случай Б. Если record11 не существует в db1 затем проверьте, существует ли запись22 в db2
try{
getRecord11;
}
catch ex11
{
saySorry1;
try
{
getRecord22;
}
catch ex22
{
saySorry2;
}
}
случай C. Получите record11 из db1. Независимо от результатов db1, получите record22 из db2.
try{
getRecord11;
}
catch ex11
{
saySorry1;
}
try
{
getRecord22;
}
catch ex22
{
saySorry2;
}
Я бы сказал, на основе псевдокода, что это потому, что исключение, которое вы бросаете в строке 7, находится внутри блока "try" вокруг линии 3, поэтому "catch" в строке 9 просто не применяется.
Изменить: что сказал Джоэл.