На языках с try-catch-finally возможно ли как-то выполнить действие для всех обработчиков исключений? - PullRequest
2 голосов
/ 28 апреля 2011

Существует ли какой-либо язык, поддерживающий что-то вроде приведенной ниже конструкции, или есть хороший способ добиться этого, используя вездесущий try-catch-finally?

try
{

} catch(Exception1 e)
  { .... }
  catch(Exception2 e)
  { .... }
  catch-finally
   {
      //Perform action, such as logging
   }
  finally
   {
     //This always occurs but I only want to log when an exception occurs.
   }

Я понимаю, это зависит от конкретного языка, но есть ли такая поддержка в Java, C #, C ++, PHP и т. д.?

Ответы [ 5 ]

1 голос
/ 28 апреля 2011

Поместите «глобальный» try / catch в вашу основную программу или метод высокого уровня.Это ловит все исключения, которые не перехвачены в других местах.

try
{
     // Main method, or higher level method call
} 
catch (Exception ex)
{
     // Log exception here
}

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

try
{
     // Do your thing
}
catch(SomeException ex)
{
     // Handle exception here

     // rethrow exception to logging handler 
     throw;
}
0 голосов
/ 28 апреля 2011

Примерно так, пока в языке есть throw без параметров для перехвата перехваченного исключения:

try
{

} catch(Everything) {
    try {
        throw;
    } catch (Exception1 e) {
        ....
    } catch (Exception2 e) {
        ....
    } finally {
        //Perform action, such as logging
    }
} finally {
        //This always occurs but I only want to log when an exception occurs.
}

Это если вы хотите регистрироваться всякий раз, когда происходит исключение - если вы хотите толькозарегистрируйте те, которые вы действительно поймали, затем не помещайте «Выполнить действие» в блок finally, просто поместите его после окончания внутреннего try-catch.

0 голосов
/ 28 апреля 2011

Вы можете легко сделать это в C #.Простым способом было бы сохранить исключение в ваших блоках catch, а затем в вашем блоке finally, зарегистрировать, если объект исключения не равен нулю.

Exception ex;

try
{

}
catch (ExceptionType1 type1)
{
    ex = type1;
}
catch (ExceptionType2 type2)
{
    ex = type2;
}
finally
{
    if (ex != null)
    {
        //Log
    }
}
0 голосов
/ 28 апреля 2011

Visual Basic имеет конструкцию, которая может быть использована для этого. Это на самом деле не «окончательно» в том смысле, что [почти] никогда не завершится неудачей, но будет поддерживать тот случай, когда вы хотите регистрировать только те исключения, которые вы обрабатываете, и у вас есть доступ к объекту исключения внутри общий код. Вы также можете использовать общий код до или после кода отдельного типа исключения.

Try
    ...
Catch ex As Exception When TypeOf(ex) Is Type1 OrElse TypeOf(ex) Is Type2
    ...
    If TypeOf(ex) Is Type1 Then
        ...
    ElseIf TypeOf(ex) Is Type2 Then
        ...
    End If
End Try
0 голосов
/ 28 апреля 2011

Я не думаю, что описанное вами поведение может быть легко смоделировано как:

boolean success = false;

try {
  ...
  success = true;
} catch (Exception_1 e) {
  ...
}
...
} catch (Exception_N e) {
  ...
} finally {
  if (success) {
    // your "finally"
  } else {
    // your "catch-finally"
  }
}
...