Как отловить два исключения одного типа и обработать их по-разному? - PullRequest
0 голосов
/ 06 июня 2018

У меня есть метод, который делает вызовы двух внешних методов.Оба эти метода могут выдавать «IllegalInputException», но эти исключения обрабатываются по-разному, в зависимости от того, какой метод их выдал.

В настоящее время они помещены в два блока try-catch:

void someMethod() {
    try {
        doSomething();
    } catch (IllegalInputException e1) {
        handleError("doSomething");
    }
    try {
        doSomethingElse();
    } catch (IllegalInputException e2) {
        handleError("doSomethingElse");
    }
}

Isесть какой-нибудь способ проверить, какой из двух вызовов метода вызвал исключение?Или в более общем смысле - кроме определения двух отдельных классов исключений, есть ли более элегантный / правильный способ справиться с такой ситуацией?

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

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Я бы не назвал это ужасно элегантным, но вот вариант.

void someMethod() {
    doSafely(() -> doSomething(), "doSomething");
    doSafely(() -> doSomethingElse(), "doSomethingElse");
}
private void doSafely(Runnable r, String argument) {
    try {
        r.run();
    } catch (IllegalInputException e) {
        handleError(argument);
    }
}
0 голосов
/ 06 июня 2018
void someMethod() {
  //this is template method pattern
  callDoSomething();
  callDoSomethingelse(); 
}

void callDoSomething() {
  try {
     doSomething();
  } catch (IllegalInputException e1) {
     handleError("doSomething");
  }
}

void callDoSomethingelse() {
  try {
     doSomethingElse();
  } catch (IllegalInputException e2) {
     handleError("doSomethingElse");
  }
}
0 голосов
/ 06 июня 2018

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

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

Другой подход - установить флаг, который вы можете использовать.

void someMethod() {
    String method = "none";
    try {
        method = "doSomething";
        doSomething();

        method = "doSomethingElse";
        doSomethingElse();
    } catch (IllegalInputException e) {
        handleError(method, e); // don't ignore the exception.
    }
...