2013-12-04 2 views
1

Нам нужно иметь две функции. Они делают то же самое, но обрабатывают исключения, и один исключает исключение. Примечание. Если для обработки исключений исключение должно обрабатываться в commonFunc() ниже. Это не сработало бы для обработки исключения в functionHandlesEx(), потому что для обработки функции ему нужна переменная, доступная только в commonFunc(). Для повторного использования кода мы получили следующее. Вы видите какие-либо проблемы с этим (я вижу, что одна проблема: функция выдает исключение, но на самом деле исключение не возникает, когда isExceptionHandled истинно ----, но Java позволяет это)? Любой лучший способ сделать это? Мы находимся на Java 6. Спасибо.Любые проблемы с этим подходом к обработке исключений?

public void functionThrowsEx() throws Exception e 
{ 
    commonFunc(false); //false means does not handle exception 
} 

public void functionHandlesEx() 
{ 
    try 
    { 
    commonFunc(true); //true means handle exception 
    } 
    catch (Exception e) 
    { 
    // do nothing as exception handled 
    } 
} 

private void commonFunc(final boolean isExceptionHandled) throws Exception 
{ 
    try 
    { 
    .... 
    } 
    catch (Exception e) 
    { 
    if (isExceptionHandled) 
    { 
     //handle the exception 
    } 
    else 
    { 
     throw e; 
    } 
    } 
} 
+0

Если нет реального исключения, не имеет значения, является ли isExceptionHandled истинным или ложным, он не будет называться – RyPope

+1

Он выглядит действительным. Я предполагаю, что try/catch в функцииHandlesEx является формальностью, чтобы компилятор не хватался за «исключение, которое не обрабатывается или не выбрасывается». (Спасибо, господин Гуденаф!) «Реальная» обработка выполняется в commonFunc. И вам нужны две разные внешние функции, так что функцииHandlesEx не нужно предложение 'throws'. –

+0

(Я не могу придумать никакого способа сделать это проще. И в Java rethrowing исключение должно работать чисто. (Не так много в некоторых других средах.)) –

ответ

0

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

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

+0

Обратите внимание, что необходимы две отдельные внешние функции, поэтому можно есть предложение 'throws', а другое нет. –

0

Вы должны избавиться от двух функций и избегать блокировки try/catch. Если вы должны вложить их в гнездо, сделайте его максимально возможным, соблюдая логику в том же методе.

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

public void functionHandlesEx() { 
try { 
    //logic here; 
    } 
} 
catch (Exception e) { 
if(iWantToHandleException) { 
    //handle exception  
    } 
    //do nothing otherwise. Use the finally block for anything else they have in common. 
    } 
} 

Это намного проще понять, и его не следует перерабатывать в эту форму.

+0

OP объяснил, что функция должна обрабатываться внутри commonFunc для доступа к внутренним данным. –

Смежные вопросы