Как определить, какой вызов функции вызвал конкретное исключение в блоке try? - PullRequest
4 голосов
/ 28 августа 2009

Допустим, есть три последовательных вызова функций в одном блоке try, и все они генерируют исключение одного типа. Как я могу выяснить, какой вызов функции вызвал перехваченное исключение при обработке?

Ответы [ 5 ]

9 голосов
/ 28 августа 2009

Вы можете поместить блок try-catch вокруг каждого вызова метода.

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

getStackTrace()[0].getMethodName()

EDIT:

Throwable

StackTraceElement

2 голосов
/ 28 августа 2009

как это:

try {
    function1();
} catch (Exception e){
    // function1 error
}

try {
    function2();
} catch (Exception e){
    // function2 error
}

try {
    function3();
} catch (Exception e){
    // function3 error
}
1 голос
/ 28 августа 2009

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

В любом случае вам нужно либо посчитать количество вызовов, использовать несколько блоков try, либо сделать это и определить свое собственное исключение, которое содержит недостающую информацию (и старое исключение, потому что это подкласс), а затем сбросить его. *

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

1 голос
/ 28 августа 2009
0 голосов
/ 28 августа 2009

Я думаю, что самоанализ трассировки стека для обработки ошибок позже очень сильно повредит вам. Если вам нужны отдельные действия для отдельных строк, поместите их в отдельные блоки try-catch.

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

int state = 0;
try {
   step1();
   state = 1;
   step2();
   state = 2;
....
} catch (Exception e) {
  if (state == 2) ....

}


Редактировать: Downvoters, пожалуйста, обратите внимание, я начал говорить, что это плохая идея; -)

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