Альтернатива массивному блоку if / else для изучения различных условий исключения? - PullRequest
3 голосов
/ 12 июля 2011

Есть ли более элегантный способ проверки всех возможных типов исключений, кроме массивного блока if / else, подобного этому?

public ModelAndView resolveException(HttpServletRequest request, 
HttpServletResponse response, Object obj, Exception e) {

    if (e instanceof BadException)
    {
      displayMessage("That was bad.");
    }

    else if (e instanceof ReallyBadException)
    {
      displayMessage("That was really bad.");
    }

    else if (e instanceof ReallyReallyBadException)
    {
      displayMessage("That was really really bad.");
    }

    // ...
    // and so on
    // ...

    return null;
}

Ответы [ 4 ]

2 голосов
/ 12 июля 2011

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

public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object obj, Exception e) {
    displayMessage(e.getMessage());
    return null;
}

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

2 голосов
/ 12 июля 2011
public ModelAndView resolveException(HttpServletRequest request, 
        HttpServletResponse response, Object obj, Exception exception)
{
    try
    { 
        throw exception;
    }
    catch(BadException e)
    {
        displayMessage("That was bad.");
    } catch (ReallyBadException e)
    {
      displayMessage("That was really bad.");
    } catch (ReallyReallyBadException e)
    {
      displayMessage("That was really really bad.");
    }

    // ...
    // and so on
    // ...

    return null;
}
1 голос
/ 12 июля 2011

Использовать несколько блоков захвата, см. Здесь .

0 голосов
/ 12 июля 2011

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

private Map<Class<?>, String> exceptionMessages = ...;

public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object obj, Exception e) {

    if exceptionMessages.containsKey(e.getClass()) {
        displayMessage(exceptionMessages.get(e.getClass()));
    }
    else {
         // what to do by default?
    }
    return ...;
}

Или, что еще лучше, вы можете экспортировать карту в файл свойств или ResourceBundle, чтобы вы могли загрузить видимую пользователю строку из какого-то другого места, кроме кода (и / или глобализировать ее).

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

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