Заменить проверенное исключение на исключение времени выполнения?

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

try {
    file.read();
} catch (IOException e){
    throw new RuntimeException(e); 
}

У этого есть несколько недостатков, но больше всего меня раздражает то, что мое исключение во время выполнения будет содержать вложенную трассировку стека. По сути, я хотел бы повторно выбросить & quot; IOException & quot; как RuntimeException (или «IORuntimeException») с исходным сообщением и трассировкой стека, так что я могу избежать бесполезной вложенной трассировки стека. «Факт» то, что я снова выбросил исключение где-то посередине, кажется мне просто бесполезным шумом.

Это возможно ? Есть ли библиотека, которая делает это?

 krosenvold08 июн. 2012 г., 12:18
@artbristol Я знаю, но я могу внести свой вклад, чтобы минимизировать проблему и избежать 400 стековых трассировок.
 AlikElzin-kilaka29 сент. 2016 г., 10:26
 missingfaktor08 июн. 2012 г., 09:15
@KazekageGaara, хорошо. Я приветствую это, если вы опубликуете это как ответ.
 Kazekage Gaara08 июн. 2012 г., 08:53
Являетсяthis Полезно?
 artbristol08 июн. 2012 г., 08:58
Если вас раздражают вложенные трассировки стека, вы будете ненавидеть большинство фреймворков и библиотек, которые склонны широко их использовать. Я бы просто привык к этому на вашем месте.

Ответы на вопрос(6)

статья это должно пролить свет на проблему. Оно используетsun.misc.Unsafe отбрасывать исключения, не оборачивая их.

Если вы рассматриваете использование Unsafe в другом ответе (я рекомендую нет, но в любом случае), другой вариант - использовать дженерики для создания проверенного исключения с помощью этой злой пары методов (изhttp://james-iry.blogspot.co.uk/2010/08/on-removing-java-checked-exceptions-by.html):

   @SuppressWarnings("unchecked")
   private static <T extends Throwable, A> 
     A pervertException(Throwable x) throws T {
      throw (T) x;
   }


   public static <A> A chuck(Throwable t) {
      return Unchecked.
        <RuntimeException, A>pervertException(t);
   }

Вы также можете проверитьcom.google.common.base.Throwables.getRootCause(Throwable) и просто распечатать его (корневую) трассировку стека.

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

Начиная с Java 8, существует другой способ:

try {
  // some code that can throw both checked and runtime exception
} catch (Exception e) {
  throw rethrow(e);
}

@SuppressWarnings("unchecked")
public static <T extends Throwable> RuntimeException rethrow(Throwable throwable) throws T {
    throw (T) throwable; // rely on vacuous cast
}

* Больше информацииВот.

class IORuntimeException extends RuntimeException {

    final IOException ioex;

    public IORuntimeException(IOException ioex) {
        this.ioex = ioex;
    }

    @Override
    public String getMessage() {
        return ioex.getMessage();
    }

    @Override
    public StackTraceElement[] getStackTrace() {
        return ioex.getStackTrace();
    }

    //@Override
    // ...
}

(Полный класс доступенВот, произведенный Eclipse «Generate Delegate Methods» макрос.)

Использование:

try {
    ...
} catch (IOException ioex) {
    throw new IORuntimeException(ioex);
}
 08 июн. 2012 г., 09:18
Ну, вы всегда можете сделатьthis.
 13 июн. 2012 г., 13:34
Ах, тогда удалите @Override ... fillInStackTrace?
 08 июн. 2012 г., 09:20
Да, но информация о типе теряется. Только если бы Java усовершенствовала дженерики ... тогда мы могли бы сделать это с помощью дженериков.
 krosenvold13 июн. 2012 г., 13:29
Интересным аспектом этого ответа является то, что он на самом деле не работает;) & quot; fillInStackTrace & quot; вызывается из конструктора throwable, означающего, что переменная-член в подклассе не была инициализирована.
 08 июн. 2012 г., 09:13
Проблема с этим подходом состоит в том, что он не может быть обобщен для любогоException типа, и, следовательно, вызывает слишком много шаблонного и дублирования кода.

Проект Ломбок позволяет полностью отключить отмеченные исключения.

 krosenvold08 июн. 2012 г., 08:52
Справедливо, но это слишком много для меня. Я предпочел бы просто сделать это где-нибудь сам
 08 июн. 2012 г., 09:14
Я сомневаюсь, что есть нехакерское решение проблемы, которую вы пытаетесь решить.

Ваш ответ на вопрос