Создание нескольких исключений в Java - PullRequest
19 голосов
/ 26 мая 2010

Есть ли способ создать несколько исключений в Java?

Ответы [ 10 ]

21 голосов
/ 26 мая 2010

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

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

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

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

20 голосов
/ 26 мая 2010

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

class AggregateException extends Exception {
    List<Exception> basket;
}
16 голосов
/ 26 мая 2010

Вы не можете бросить два исключения. То есть Вы не можете сделать что-то вроде:

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

Альтернатива 1: исключение A - , вызванное исключением B

Вы можете вкладывать исключения, используя причина-конструктор для выполнения следующих действий:

try {
    Exception ex1 = new NullPointerException();

    // Throw an IllegalArgumentException that "wraps" ex1
    throw new IllegalArgumentException(ex1);
} catch (IllegalArgumentException iae) {
    // handle illegal argument...
    throw iae.getCause(); // throws the cause (the NullPointerException)
}

Хорошая статья о цепочечных исключениях: Программирование. Руководство: Цепные исключения

Альтернатива 2: использовать подавлено исключение

Одно исключение может подавить другое исключение.

try {
    Exception ex1 = new NullPointerException();

    // Throw an IllegalArgumentException that "suppresses" ex1
    IllegalArgumentException ex2 = new IllegalArgumentException();
    ex2.addSuppressed(ex1);
    throw ex2;
} catch (IllegalArgumentException iae) {
    // handle illegal argument...
    ... iae.getSuppressed() ... // get hold of the suppressed exceptions
}

Хорошая статья об исключенных исключениях: Программирование. Руководство: Исключенные исключения

6 голосов
/ 26 мая 2010

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

Если вам нужно отслеживать причины, вы можете связать исключения:

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

Доступно через getCause().

5 голосов
/ 26 мая 2010

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

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 голосов
/ 24 марта 2015

Чтобы сгенерировать несколько исключений в 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, где вы хотите (очевидно, внутри блока catch) подавить любое исключение. И в конце явно бросьте aggExcep, используя ключевое слово throw, куда хотите.

void addSuppressed (исключение Throwable)

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

3 голосов
/ 26 августа 2012

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

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

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

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

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

3 голосов
/ 26 мая 2010

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

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

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

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

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

1 голос
/ 05 декабря 2016

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

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

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 у вас есть функция multi catch.

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.
  ...
 }

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

0 голосов
/ 21 июня 2014

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

например:

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

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

привет

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