2010-05-26 4 views
14

Есть ли способ выбросить несколько исключений из java?Бросание нескольких исключений в Java

+2

Непонятно, будет ли ОП запрашивать «бросание одного из нескольких» исключений или «бросание нескольких исключений в одно и то же время» –

ответ

14

Нет, нет никакого способа вы могли бы сделать что-то вроде:

try { 
    throw new IllegalArgumentException(), new NullPointerException(); 
} catch (IllegalArgumentException iae) { 
    // ... 
} catch (NullPointerException npe) { 
    // ... 
} 

, если это то, что вы просите.

Вы могли однако использовать cause-constructor сделать следующее:

try { 
    throw new IllegalArgumentException(new NullPointerException()); 
} catch (IllegalArgumentException iae) { 
    // handle illegal argument... 
    throw iae.getCause(); // throws the cause (the NullPointerException) 
} 
6

Бросив более одного исключения не имеет смысла, потому что вы не можете иметь более одной ошибки (ошибка может имеют несколько причин, но не может быть больше одной ошибки в любое время).

Если вам необходимо отслеживать причины, вы можете исключения цепи:

} catch (Exception ex) { 
    throw new RuntimeException("Exc while trying ...", ex); 
} 

Они доступны через getCause().

+6

Пожалуйста, не поощряйте людей ловить базу «Исключение». Кроме того, для переупаковки исключений я являюсь базовым классом исключения для проекта. Таким образом, я могу различать допустимые исключения, которые я уже завернул и планирую, и неожиданное исключение. – unholysampler

+1

@unholysampler: Согласен. –

3

У вас может быть возможность выбросить несколько разных исключений. Например:

if (obj == null) 
    throw new NullPointerException(); 

if (some other case) 
    throw new IllegalArgumentException(); 

if (this == this) 
    throw new IOException(); 

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

19

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

class AggregateException extends Exception { 
    List<Exception> basket; 
} 
11

Метод может бросить один из нескольких исключений. Например:

public void dosomething() throws IOException, AWTException { 
     // .... 
} 

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

Вы также можете выкинуть вложенное Исключение, содержащее внутри другого объекта исключения. Но это вряд ли считало бы это «бросанием двух исключений», оно просто представляет собой один случай исключения, описанный двумя объектами исключений (часто из разных слоев).

+0

очень полезно, лучший ответ –

5

Я видел картину, где обычай исключение внутренне хранит другие исключения (не помню, почему они это сделали), но это было как:

public class ContainerException extends Exception { 

    private List<Exception> innerExeptions = new Arrayist<Exception>(); 

    // some constructors 

    public void add(Exception e) { 
    innerExceptions.add(e); 
    } 

    public Collection<Exception> getExceptions() { 
    return innerExceptions; 
    } 
} 

и она была использована, как это:

try { 
    // something 
} catch (ContainerException ce) { 
    ce.add(new RunTimeException("some Message"); 
    throw ce; // or do something else 
} 

Позже в коде исключение контейнера было оценено и сбрасыто в файл журнала.

3

Шаблон, описанный Andreas_D, определенно полезен всякий раз, когда вы обрабатываете, скажем, компиляцию на стороне сервера предоставленного пользователем файла и хотите сообщить об ошибках.

Например, у вас может быть исключение CompilationException, которое генерируется, если ресурс не скомпилируется. Компиляция может означать любое количество вещей. Например, вы можете оценить текст внутри файла, который загружает конечный пользователь, анализировать токены, проверять наличие синтаксических ошибок и определять, является ли файл действительным. В конце, вещь является либо действительной, либо недействительной, и вы хотите передать правильное исключение CompilationException для распространения резервной копии стека вызовов.

Как и Андреас, у вас может быть метод add(), который позволяет добавлять проблемы компиляции в ваше исключение. Эти проблемы не обязательно должны быть Исключениями, но это зависит от вас. Это часто помогает придерживаться единой структуры исключений, так что вы можете использовать одну и ту же логику проверки в нескольких местах.

Во всяком случае, вы хотите, чтобы одно исключение CompilationException возвращалось через стек вызовов, потому что это говорит о структуре, которую вещь не скомпилировала. Если кто-то из цепочки хочет знать, почему, тогда они могут получить основные проблемы с вызовом, например, getCauses().

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

0

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

, например:

public static void main(String[] args) throws Exception 
{ 
    getClipboard(); // throws an UnsupportedFlavorException 
    initIOActivity(); // throw an IOException 
} 

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

приветствие

+0

Если вы хотите бросить несколько исключений, вы должны действительно определить свой метод как «public void method() throws UnsupportedSomethingException, IOException {...}'. Использование «Исключения» само по себе - это быстрый способ избавиться от большой мощности, которую вы получаете от правильной обработки исключений. Я бы посоветовал поймать Exception в потоке пользовательского интерфейса или на каком-то верхнем уровне, чтобы избежать полного сбоя. – indivisible

2

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

public class AggregateException extends Exception { 


     public void addException(Exception ex){ 

     addSuppressed(ex); 
     exception = true; 
    } 
} 


public class AnyClass{ 

    public AggregateException aggExcep = new AggregateException(); 

    public void whereExceptionOccurs(){ 
     try{ 

       //some code 
     }catch(Exception e){ 

       aggExcep.addException(e); 
       //throw aggExcep; 
     } 
    } 
} 

Вызвать метод addException с той же ссылкой aggExcep, куда вы хотите (Внутри блока поймать очевидно) подавить любое исключение. И в конце явно бросайте aggExcep, используя ключевое слово «throw», где бы вы ни захотели.

недействительного addSuppressed (Throwable исключение)

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

0

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

1) Если вы хотите бросить несколько исключений за раз, я думаю, вы не можете этого сделать. Рассмотрим аналогичную ситуацию. Когда вы решаете математические вопросы и достигаете точки, в которой вы делите на 0, в ЭТОЙ ТОЧКЕ времени есть только одна ошибка, и это деление на ноль. Поэтому я думаю, вы можете просто выбросить одну ошибку для данного оператора. Однако в вашем блоке catch try может существовать множество операторов, каждый из которых может вызвать различную ошибку.

2) ЕСЛИ вы хотите обрабатывать/улавливать несколько ошибок, есть два способа сделать это. я) До Java 7:

`try{ 
    ... 
    //some method/action that can be a cause of multiple errors,say X and Y 
    ... 
}catch(XException e){ 
     //Do something if exception X arises. 
}catch(YException e){ 
     //Do something if exception Y arises. 
} 
` 

II) После Java 7, у вас есть возможность поймать несколько.

try{ 
    ... 
    //some method/action that can be a cause of multiple errors,say X and Y 
    ... 
}catch(XException|YException e){ 
    // Take action appropriate to both types of exception. 
    ... 
} 

Я считаю, что это решит ваши сомнения. Это мой первый ответ, все предложения приветствуются!

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