2013-09-05 6 views
0

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

OK. поэтому мой код не заботится о том, какое исключение выбрасывается, 99,9% времени, если возникает исключение, оно обрабатывает его одинаково независимо от того, что.

Теперь, почему я даже хочу бросить \ создание нового исключения в моем коде? , очевидно, все библиотеки, которые я использую, бросают их уже и очень информативны.

нулевой объект, переданный для моего метода? кто заботится, исключение нулевого указателя будет автоматически выбрано для меня.

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

EDIT, что я имею в виду:

зачем с этим:

public myMethod() { 

try { 
    doStuff1(); 
} 
catch(Exception e) { 
throw new Exception("Error in doStuff1"); 
} 
try { 
    doStuff2(); 
} 
catch(Exception e) { 
throw new Exception("Error in doStuff2"); 
} 

, когда я могу использовать это:

public myMethod() { 

doStuff1(); 
doStuff2(); 

} 
+1

Многие хорошие вопросы порождают определенное мнение, основанное на опыте экспертов, но ответы на этот вопрос будут иметь тенденцию почти полностью основываться на мнениях, а не на фактах, ссылках или конкретном опыте. – hexafraction

+3

Вы имеете в виду объявление новых исключений * classes * или новых исключений * экземпляры *? На данный момент ваш вопрос неясен. Было бы полезно, если бы вы предоставили конкретные примеры. –

+1

Как показывает @hexafraction, это довольно субъективный вопрос, и вокруг какого контекста будет много разных мнений. Уровень, на котором вы сейчас программируете, не определен пользователям, читающим ваш вопрос, поэтому мы не знаем, запрограммировали все, что на самом деле требует правильной обработки исключений. Идея, которую вы предлагаете использовать в библиотеках, может также предполагать, что вы никогда не создавали свою собственную библиотеку, которая позволяет предположить, что вы считаете, что обработка исключений бессмысленна. –

ответ

1

Ваш клиент хочет подробные отчеты об ошибках. Что пошло не так, и где все пошло не так.

Они не имеют понятия, что такое исключение нулевого указателя. И даже тогда это само по себе не особенно полезно без трассировки стека. Итак, нулевой указатель попадает в ваш метод RetrieveReportX? Проверьте, является ли оно нулевым и генерирует исключение ReportXNoIdentifierException, а не позволяет ему автоматически исключить исключение нулевого указателя. Тогда у вас будет обработчик ошибок где-нибудь, который на основе этих пользовательских исключений может точно сообщить, что пошло не так, в каком (человеческом) процессе, и ваш клиент счастлив, потому что вместо NullPointerException в [stacktrace] они могут видеть «Идентификатор не было поставлено при попытке получить отчет X. "

0

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

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

При создании пользовательского исключения любое исходное исключение должно быть вложено внутри него (передача его в конструктор или передача его в setCause). Пример кода в вашем вопросе отбрасывает stacktrace; потеря первоначального исключения затрудняет определение того, что пошло не так. Также новое исключение должно быть более значимым, чем просто исключение.

0

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

В некоторых случаях принято и целесообразно бросать Exception нарочито.
Возьмите

IllegalArgumentException

Если ваш метод принимает только аргументы в пределах определенного диапазона, например, только положительные числа, тогда вы должны проверить недопустимые параметры и выбросить исключение IllegalArgumentException.

Например:

public int calculateFactorial(int n) { 
    if (n < 0) 
    throw new IllegalArgumentException("n must be positive"); 
    if (n >= 60) 
    throw new IllegalArgumentException("n must be < 60"); 
    ... 
} 
public void findFactorial(int n) 
{ 
    try{ 
      calculateFactorial(n)  
     }catch(IllegalArgumentException ie){ 
     System.out.println(ie.getMessage()); 
     } 
} 
0

From Java tutorials - Advantages of Exceptions

  1. Преимущество 1: Разделение обработки ошибок от "Regular" Код
  2. Преимущество 2: Размножение ОШИБКИ на вызов стека
  3. Преимущество 3: группирование и дифференциация типов ошибок

Ответ

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

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

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