2016-09-11 6 views
-1

В одном из программных продуктов, которые я разрабатываю, я пытаюсь управлять механизмом исключения.java.lang.exception.getCause() получает null каждый раз

В какой-то программе я делаю что-то вроде;

IF(my condition not allowed){ 
    throw new Exception("My condition not allowed", null) 
} 

кидаю нуль с параметром java.lang.Exception, чтобы понять, что это то, что не имеет отношения с programatical ошибки. (У меня нет возможности создать собственное собственное исключение, пожалуйста, подумайте об этом)

И где-то над программированием я поймаю свое исключение, как это;

}catch(Exception e){ 
if(null == e.getCause) 
    do.somethingThatIWantToCatch(); 
}else{ 
    do.somethingProgramaticalError(); 
} 

здесь проблема; мой код может бросить что-то еще, что я не знаю, как NullPointerException, ArrayIndexOutOfBoundsException и т. д.

На этом этапе я ожидаю, что e.getCause() НЕ должен быть пустым, если я получаю программную ошибку, однако я получаю NULL all время, и я выполняю свой do.somethingThatIWantToCatch(); состояние все время.

Как я могу справиться с этой ситуацией и выполнить my do.somethingProgramaticalError(); состояние ???

Заранее спасибо

+1

Прочитайте документацию; 'getCause()' обычно будет null. Вам нужно создать свое собственное исключение. – SLaks

+0

Это ужасное злоупотребление системой исключений. Если вы хотите поймать свое собственное исключение, * throw * ваше собственное исключение. Создайте производный класс исключений или несколько. – EJP

+0

Спасибо, что сообщили мне, но я уже знаю, что это не правильный способ справиться с исключениями. Пока я работаю над строгой инфраструктурой в банке, они не позволяют мне создавать свое обычное исключение. Вот почему я ищу обходной путь. Мне нужно решение этого, а не знание того, правильно ли оно использовать или нет. Благодаря :) – BurakT

ответ

0

Вы должны никогда бросить экземпляр Exception (или его непроверенную ребенка RuntimeException). Вы всегда должны найти подходящий подкласс для броска или создать свой собственный подкласс, если он еще не подходит.

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

Что касается getCause(), то это, как правило, исключение, которое передается в конструктор другого исключения. Это будет иметь место для подавляющего большинства исключений, с которыми вы сталкиваетесь.