2013-07-10 2 views
-2

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

Скажем, у меня есть функция:

public int func(int a, int b) throws IOException, EOFException { 
    try { 
     doSomething(a, b); 
    } catch (AllExceptionsExceptionIOandEOF e) { 
     doSomethingWithError(e); 
    } 
    return 0; 
} 

Есть ли способ сказать Java, как это сделать? Я знаю, что общий ролик Exception работает для всех, но я хочу бросить все, кроме заброшенного исключения.

Если это считается плохой практикой, почему? И что является хорошей альтернативой для достижения той же цели?

(PS - Я знаю, что я знаю, что все возможные исключения нужно обрабатывать индивидуально. Для моих целей я просто хочу поймать ошибки, зарегистрировать их в базе данных и посмотреть, что происходит . что мы пропустили во время разработки я не хотел, чтобы поймать общий Exception когда моя функция уже метания 2 исключения)

Это просто произошло со мной, один из способов было бы сказать:

try { 
    doSomething(a, b); 
} catch (AllExceptionsExceptionIOandEOF e) { 
    doSomethingWithError(e); 
    if (e instanceof IOException) 
     throw e; 
    if (e instanceof EOFException) 
     throw e; 
} 

есть более элегантный способ сделать это?

EDIT - проект выполнен в соответствии с требованиями Java 6, к сожалению. Я знаю, что Java 7 заставил Try/Catches немного более гибким.

+1

Только сделайте это в * одном * месте в своем приложении. См. Http://www.oracle.com/technetwork/java/effective-exceptions-092345.html – artbristol

ответ

0

Из java 1.7 вы можете группировать правила исключения.

try{ 
     //some code 
}catch(IOException | AnotherException e){ 
    //do what you want 
}catch(RuntimeException re){ 
    //happen a runtimexception 
} 

И перехватывать все исключения, что функция не забросить это только может быть RuntimeException и подклассы, потому что они являются непроверенными исключениями.

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

Например:

catch(EOFException e){ 

}catch(IOException e){ 

} 

Кстати, только поймать исключение один раз.

+0

Улавливание общего «Исключения» также не включает в себя «RuntimeException»? –

+0

@ EricS да, но это плохая практика .. вам нужно поймать менее общее исключение .. :), вы также с этой идеей поймаете Throwable, что поймает ошибку и исключение, но не имеет смысла. – nachokk

1
try { 
    doSomething(a, b); 
} catch (IOException e) { 
    throw e; 
} catch (EOFException e) { 
    throw e; 
} catch (Exception e){ 
    doSomethingWithError(e); 
} 
+0

А не плохо, хотя Я ненавижу повторять код. Голосование, но надеясь, что есть более элегантный способ ... –

+0

, что не очень хорошо ... catch исключение не является хорошей практикой .. если doSomething не выбрасывает исключение, вы не хотите ломать Exception .. – nachokk

0

В предварительно java1.7

try{} 
catch(FileNotFoundException e){} 
catch(IOException e){} 
catch(Exception e){ 
    //anything not handled in other catch clause 
} 

Просто убедитесь, что объявлять об уловах пункты с более конкретными менее конкретны.

В Java 1.7 вы можете сделать фантастические вещи:

catch(IOException | EOFException e){} 
0

Поскольку EOFException расширяет IOException вы можете поймать IOException и бросить его, как показано ниже

поймать (IOException е) {// делать то, что вы хотите }

0

По другим ответам, особенно пред-Java 1.7, у вас нет действительно хорошего ответа.Если это будет сделано во многих местах в вашем коде, и вы в первую очередь хотите его развития, я мог бы предложить создать специальный обработчик:

class ExceptionHandler 
{ 
    public static void handle(Throwable t, Class<? extends Exception> rethrowClasses...) 
    { 
    for (Class e : rethrowClasses) 
    { 
     if e.isInstance(t) 
     { 
     throw t; 
     } 
    } 
    } 
} 

Затем в блоке исключения:

try 
{ ... } 
catch (Exception e) 
{ 
    ExceptionHandler.handle(e, IOException.class, EOFException.class); 
    // other processing 
} 

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

Это не здорово, но у вас не так много хороших решений.

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