В Java есть 2 разных вида исключений: проверено и снято с охраны. Существует большая дискуссия, по которой лучше использовать, оба аргумента хороши.
Исключено в основном исключение из java.lang.Exception
, и для этого требуется, чтобы, если вы не указали свой метод как «throws MyCheckedException», вы должны поймать и обработать исключение в своем методе.
// throw the exception
void foo() throws MyCheckedException
{
throw new MyCheckedException();
}
// or handle the exception
void foo()
{
try {
throw new MyCheckedException();
} catch (MyRuntimeException e) {
e.printStackTrace();
}
}
Переполнение исключения, полученное из java.lang.RuntimeException
, не требует ни, что вы определяете «кидает» в вашем определении метода или что вы справиться с этим.
void foo()
{
throw new MyUncheckedException();
}
Преимущество Checked заключается в том, что компилятор предупредит вас, когда вы не обработали исключение.
Недостаток заключается в том, что вам нужно объявить блок try/catch или броски для каждого проверенного исключения, а код верхнего уровня может стать довольно громоздким, пытаясь обрабатывать все различные типы исключений.
По этой причине, если вы будете осторожны, вы можете использовать Unchecked Exceptions.
BTW, вы можете выбрать свой тип исключения только при определении своего собственного.
При встрече с исключениями из Java или сторонней библиотеки вам необходимо решить, как с этим справиться. например Если сторонний метод выдает CheckedException1, вам нужно либо обработать его, либо объявить вызывающий метод как «throws CheckedException1». Если вы хотите избежать использования Проверенных исключений, вы можете обернуть его в Unchecked Exception и выбросить.
void foo() // no throws declaration
{
try {
thirdPartyObj.thirdPartyMethod(); // this throws CheckedException1
}
catch (CheckedException1 e) {
throw new MyUncheckedException(e); // this will wrap the checked in an unchecked.
}
}
Обратите внимание, что вы можете выбросить исключение Unchecked без объявления «throws». Чтобы получить доступ к исходному CheckedException1 выше, вы можете использовать метод .getCause() вашего исключения Unchecked.
void caller()
{
try {
foo();
} catch (MyUncheckedException e) {
CheckedException1 ce1 = e.getCause();
ce1.printStackTrace();
}
}
... а потому, что исключение из Foo() является Неконтролируемым, вы не имеют обрабатывать его или объявить «кидает».
Что касается лесозаготовки, на это разные школы мысли.
- Log, когда исключение происходит (низкий - уровень)
- Log, когда она достигает верхней (высокий - уровень)
- Log, когда у вас есть достаточно информации, чтобы сделать соответствующие действия и/или сообщение журнала. (средний уровень)
Хорошая политика, которую я обнаружил, заключается в установке обработчика исключенных исключений, который позаботится обо всех неперехваченных (явно непроверенных) исключениях. Таким образом, все, что пропущено, будет регистрироваться и потенциально обрабатываться до сбоя системы.
public class MyExceptionHandler implements UncaughtExceptionHandler
{
@Override
public void uncaughtException(Thread thread, Throwable ex)
{
ex.printStackTrace();
}
}
// In your high-level code
Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());
и все для исключения, которые могут быть обработаны изящно, перехватывать и обрабатывать их в модуле, где вы знаете достаточно о ситуации, возможно, исправить эту проблему и попробовать еще раз.
Хотя этот ответ является точным, ответ paiego ниже намного полезнее. – Gowiem