Вопрос по exception-handling, java – Заменить проверенное исключение на исключение времени выполнения?

9

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

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

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

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

@artbristol Я знаю, но я могу внести свой вклад, чтобы минимизировать проблему и избежать 400 стековых трассировок. krosenvold
Связанные с:stackoverflow.com/q/39719370/435605 AlikElzin-kilaka
@KazekageGaara, хорошо. Я приветствую это, если вы опубликуете это как ответ. missingfaktor
Являетсяthis Полезно? Kazekage Gaara
Если вас раздражают вложенные трассировки стека, вы будете ненавидеть большинство фреймворков и библиотек, которые склонны широко их использовать. Я бы просто привык к этому на вашем месте. artbristol

Ваш Ответ

6   ответов
3

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

2

Если вы рассматриваете использование 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) и просто распечатать его (корневую) трассировку стека.

0

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

0

Начиная с 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
}

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

3
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);
}
Ну, вы всегда можете сделатьthis.
Ах, тогда удалите @Override ... fillInStackTrace?
Да, но информация о типе теряется. Только если бы Java усовершенствовала дженерики ... тогда мы могли бы сделать это с помощью дженериков.
Интересным аспектом этого ответа является то, что он на самом деле не работает;) & quot; fillInStackTrace & quot; вызывается из конструктора throwable, означающего, что переменная-член в подклассе не была инициализирована. krosenvold
Проблема с этим подходом состоит в том, что он не может быть обобщен для любогоException типа, и, следовательно, вызывает слишком много шаблонного и дублирования кода.
4

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

Справедливо, но это слишком много для меня. Я предпочел бы просто сделать это где-нибудь сам krosenvold
Я сомневаюсь, что есть нехакерское решение проблемы, которую вы пытаетесь решить.

Похожие вопросы