Попробуйте поймать блок

У меня есть следующий код

Try
    'Some code that causes exception
Catch ex as ExceptionType1
    'Handle Section - 1
Catch ex as ExceptionType2
    'Handle section - 2
Catch ex as ExceptionType3
    'Handle section - 3    
Finally
    ' Clean up
End Try

Предположим, что ExceptionType1 вызывается кодом, который обрабатывается разделом 1. Могу ли я после обработки этого раздела 1 передать управление разделу 2/разделу 3? Это возможно?


person MOZILLA    schedule 12.12.2008    source источник
comment
Не могли бы вы опубликовать цель, почему вы хотели бы это сделать?   -  person shahkalpeshp    schedule 12.12.2008


Ответы (4)


Измените код, чтобы он перехватывал все исключения в одном блоке и определял оттуда тип и путь выполнения.

person kemiller2002    schedule 12.12.2008

Вы можете вызывать функции в обработчиках исключений.

Try
'Some code that causes exception'
Catch ex as ExceptionType1
  handler_1()
  handler_2()
  handler_3()
Catch ex as ExceptionType2
  handler_2()
  handler_3()
Catch ex as ExceptionType3
  handler_3()
Finally
  handler_4()    
End Try
person acrosman    schedule 12.12.2008

Вы не указали язык, а я языка не знаю, поэтому отвечаю в общем.

Вы не можете этого сделать. Если вы хотите иметь общий код, поместите его либо в finally, либо, если его нужно выполнить только для некоторых ловушек, вы можете скопировать этот код в соответствующие случаи. Если код больше и вы хотите избежать избыточности, вы можете поместить его в отдельную функцию. Если это уменьшит читабельность вашего кода, вы можете вложить свои блоки try/catch (по крайней мере, в Java и C++. Я не знаю о вашем языке). Вот пример на Java:

class ThrowingException {
    public static void main(String... args) {
        try {
            try {
                throw new RuntimeException();
            } catch(RuntimeException e) {
                System.out.println("Hi 1, handling RuntimeException..");
                throw e;
            } finally {
                System.out.println("finally 1");
            }
        } catch(Exception e) {
            System.out.println("Hi 2, handling Exception..");
        } finally {
            System.out.println("finally 2");
        }
    }
}

Это распечатает:

Hi 1, handling RuntimeException..
finally 1
Hi 2, handling Exception..
finally 2

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

person Johannes Schaub - litb    schedule 12.12.2008

Я думаю, что вы можете получить желаемое поведение, если сделаете вложенные блоки try. Как только возникает исключение, выполнение переходит к блоку catch. Если ничего не перебрасывается, он переходит к finally.

person Matt Briggs    schedule 12.12.2008