Сравнение исключений - PullRequest
0 голосов
/ 22 декабря 2011

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

private List<java.lang.Class> connectionExceptions;
try {

// trying to connect to external module;

} catch(Exception e) {
   // Need to compare this exception e with a list of exceptions which I have, 
   // and the action depends on the results. There may be some other exception 
   // which are not in the list.
}

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

Я знаю, поток управления зависит от исключения, это не хорошая практика. Но мне нужно это сделать.

Ответы [ 5 ]

2 голосов
/ 09 марта 2015

Поскольку класс Exception использует функцию equals () класса Object, connectionExceptions.contains(e) не даст правильного ответа, поскольку каждый экземпляр Exception e, имеющий одну и ту же причину и трассировку стека, будет иметь разные значения по умолчаниюHEX личность.Однако, если вы хотите сравнить два исключения, можно использовать Arrays.deepEquals(Object, Object).

catch (Exception e) {
  boolean sameException = false;
  for (Exception ee : connectionExceptions) {
    sameException = Arrays.deepEquals(e.getStackTrace(), ee.getStackTrace());
    if (sameException) {
      break;  //exception matched
    }
  }
}
2 голосов
/ 22 декабря 2011

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

...
catch(SomeException e) {
  //do something
}
catch(SomeOtherException e) {
  //do something else
}

Или, чтобы действительно проверить, есть ли исключение в вашем списке, используйте connectionExceptions.contains(e.getClass()).

1 голос
/ 22 декабря 2011
if (connectionExceptions.contains(e) {
   //
}

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

} catch (FooException) {

} catch (BarException) {

}

Или multi-catch в Java7:

} catch (FirstException | SecondException ex) {
0 голосов
/ 27 июля 2016

Питер Кнего объясняет, как сравнивать исключения в этом ответе .

В принципе, вы можете использовать instanceof для сравнения.

0 голосов
/ 22 декабря 2011

Abimaran, ваш вопрос: «проверьте, есть ли исключение (выброшенное в блоке try) в вашем списке или нет».Таким образом, чтобы проверить это, механизм проверки должен быть очень прямым или подробным, я имею в виду

  • Подробно вести список, карту или любую вещь каждого исключения (например, если это возможно, тип,класс и т. д. исключения)
  • Когда вы проверяете исключение в блоке catch, просто используйте некоторые функции, предоставляемые универсальными классами Java.

Это лучшее, что выможет сделать для этого сценария.

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