Протокол обработки исключений для методов - PullRequest
2 голосов
/ 05 июня 2010

Существует ли какой-либо конкретный протокол для обработки исключений в открытых методах? Рассмотрим это, например.

public int someMethod()
{
  try{
  code that might throw an exception    
  }
  catch(Exception e)
  {
     log the exception
  }
}

Скажите, что этот метод может вызвать исключение ArrayIndexOutOfBoundsException. Итак, правильно ли обрабатывать это исключение в самом методе (как в примере) или выдавать его и предполагать, что вызывающий метод будет обрабатывать исключение?

Edit: Расширяя мой вопрос. Рассмотрим следующую функцию.

public int[] someMethod2()
{
  try{
code that might throw an exception    
 }
catch(Exception e) {
  log the exception
  return new int[0];
 }
}

Как и в примере кода выше, если я верну массив размером 0, то вызывающий метод завершится с ошибкой AraryIndexOutOfBounds. Если я верну null, то вызывающий метод завершится с ошибкой NullPointer Exception. Так как я могу изменить вызывающий метод, какой способ лучше? Должен ли я позволить вызывающему методу потерпеть неудачу? Или я должен напрямую вызывать System.exit () в someMethod2 ()?

Есть ли учебник, который объясняет эти решения? Это не дает мне ответа.

Ответы [ 5 ]

2 голосов
/ 05 июня 2010

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

Одно большое нет-нет возвращает ноль вместо выдачи исключений, как этот код:

public Thing getThingById(long id) {
    try {
        ResultSet rs = queryDatabase("SELECT * FROM THING WHERE ID = " + id);
        rs.next();
        return new Thing(rs.get(1), rs.get(2), rs.get(3));
    } catch (Exception e) {
        return null;
    }
}

Теперь, если вы получите null от этого метода, вы не знаете почему. Был ли идентификатор недействительным? Сервер базы данных не работает? Или это была какая-то программная ошибка в методе queryDatabase

Edit: О, и вы никогда не должны регистрировать и rethrow, это просто заполнит ваши журналы и сделает их нечитаемыми. Если вы перебрасываете исключение, вероятно, что какой-либо код перехватит его далее в цепочке вызовов, это тоже будет записано

1 голос
/ 05 июня 2010

тоже нет. Ничего не делать. ArrayIndexOutOfBoundsException указывает на программную ошибку, которая не должна быть обнаружена вообще или обнаружена только на высоком уровне приложения. Поскольку это подкласс RuntimeException, вам не нужно объявлять, что метод также его выбрасывает.

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

0 голосов
/ 05 июня 2010

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

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

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

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

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

0 голосов
/ 05 июня 2010

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

0 голосов
/ 05 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...