Как отловить внутреннее исключение в .NET?

2

Как я могу уловить внутреннее исключение в .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 никогда не обрабатывается моим кодом.

Как правильно обработать внутреннее исключение?

Теги:

5 ответов

10
Лучший ответ

Причина, по которой ваш текущий код не работает, заключается в том, что как только вы входите в секцию 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
  • 0
    Благодарю. Первый пример работает отлично. К сожалению, я не могу избежать исключения. «База данных» - это служба Azure REST, которая возвращает 404, если запись не найдена. Это заставляет оболочку REST генерировать исключение.
  • 0
    PS Думаю, мне не нужно было бросать внутреннее исключение вообще.
3

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

  • 0
    Хм, это то, что я пытался сделать с Catch ex as Exception . Я думал, что внутреннее исключение будет просто поймано внешним Catch .
1

Во-первых, если вы используете try/catch, вы, вероятно, должны, наконец, очистить ресурсы. При этом, если вложенные try/catch блокируют нас, как правило, запах кода. Вы должны реализовать его таким образом? Почему сервер просто терпит неудачу? Почему Data Layer не смог передать сообщение статуса? Исключения должны быть, ну, "исключительными".

Если вам нужно использовать исключения, "Joel Coehoorn" кажется хорошим.

  • 0
    Спасибо за мысли. К сожалению, я не знаю, как использовать исключения. В таблицах Azure, если вы ищете уникальную сущность, а она не найдена, возникает исключение. То есть, если вы ищете конкретную комбинацию PrimaryKey и RowKey, вы выбросите исключение DataServiceQueryException.
0

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

Случай А. Если запись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;
}
  • 0
    Спасибо за ваш пост. Я в значительной степени случай B, за исключением того, что мой сценарий "Получить record11 из db1. Если не получится, получить record11 из db2. Если не получится, скажем извините" Спасибо за ваши примеры.
0

Я бы сказал, на основе псевдокода, что это потому, что исключение, которое вы бросаете в строке 7, находится внутри блока "try" вокруг линии 3, поэтому "catch" в строке 9 просто не применяется.

Изменить: что сказал Джоэл.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню