2016-08-04 7 views
1

У меня есть несколько пользовательских классов исключений. (Diffrent Error Codes/Error Messages) Некоторые из них приводят к завершению. Вот почему я позволяю им распространяться в основном. Чтобы распечатать код ошибки + сообщение.Расширенная обработка исключений

Если я поймаю суперкласс, есть ли способ, если у вас нет длинного списка, если вы хотите проверить, какой подкласс я купил, чтобы перейти к методу overriden?

Было бы более читаемым иметь несколько заявлений об уловах?

Должен ли я отбрасывать их на более низком уровне до более высокого Исключения и только ловить это исключение?

+1

«не имея длинного списка« если есть », чтобы проверить, какой подкласс« вы могли бы использовать посетителя (возможно) –

ответ

6

Если вам необходимо обработать SubclassOfException определенным образом, используйте catch SubclassOfException.

Нет смысла использовать цепочку из instanceof, если это в основном то, что уже делает обработка исключений.

try { 
} catch (SubclassOfException e) { 
    // Do something specific to SubclassOfException 
} catch (Exception e) { 
    // Do something for other types. 
} 

в основном так же, как:

try { 
} catch (Exception e) { 
    if (e instanceof SubclassOfException) { 
    // Do something specific to SubclassOfException. 
    // Note that you have to cast explicitly if you want to use 
    // subclass-specific properties of SubclassOfException. 
    } else { 
    // Do something for other types. 
    } 
} 

Я думаю, ясно, что первое является более удобным для чтения, и это будет более эффективно выполняться, так это то, как JVM ожидает код обработки исключений для написания.

Еще одно преимущество написания в первом способе является то, что вы не можете написать:

try { 
    // ... 
} catch (SubclassOfException e) { 
} catch (SubclassOfSubclassOfException e) { 
} 

, потому что первый улов будет перехватывать все исключения, которые будут подбираются второй улов, делая второй улов избыточными. Таким образом, это ошибка во время компиляции, описанная в JLS Sec 11.2.3:

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

Прежде всего, вам нужно поймать наиболее специфичные типы и наименее специфичные типы после.

С другой стороны,

if (e instanceof SubclassOfException) { 
} else if (e instanceof SubclassOfSubclassOfException) { 
} 

не ошибка во время компиляции, даже если вторая ветвь не может быть выполнена либо; вы просто увидите, что все SubclassOfSubclassOfException s обрабатываются так, как если бы они были просто SubclassOfException s.

+0

, поэтому мне нужно будет заказать блоки catch с наименьшим наследованием сначала или есть способ сказать посмотреть на базу уровень этого экземпляра? – gismo

+1

@gismo Я думаю, что редактирование, которое я делал, когда вы прокомментировали это сообщение? –

Смежные вопросы