Перенесите исключения исключениями на этапе выполнения с аннотацией

Подводя итог предыдущим комментариям:

function() {
  alert("hello");
}();

, когда переменная не назначена, выдает синтаксическую ошибку. Код анализируется как оператор функции (или определение), что делает синтаксически некорректно закрывающие скобки. Добавление скобок вокруг части функции говорит интерпретатору (и программисту), что это выражение функции (или вызов), как в

(function() {
  alert("hello");
})();

Это функция, вызывающая себя, то есть она создается анонимно и выполняется немедленно, потому что вызов происходит в той же строке, где он объявлен. Эта функция, вызывающая себя, обозначена знакомым синтаксисом для вызова функции без аргументов, а также добавлены круглые скобки вокруг имени функции: (myFunction)();.

Существует хороший SO SO-обсуждение синтаксиса функции JavaScript .

8
задан ripper234 27 June 2009 в 10:23
поделиться

3 ответа

Это можно сделать с помощью AspectJ. Вы объявляете точку соединения (в данном случае вызов метода foo) и «смягчаете» исключение.

Edit Чтобы уточнить это:

Допустим, у вас есть следующий класс Bar :

public class Bar {

    public void foo() throws Exception {
    }
}

... и у вас есть такой тест:

import junit.framework.TestCase;

public class BarTest extends TestCase {

    public void testTestFoo() {
        new Bar().foo();
    }
}

Тогда очевидно, что тест не будет компилироваться. Это приведет к ошибке:

Unhandled exception type Exception  BarTest.java(line 6)

Теперь, чтобы преодолеть это с помощью AspectJ, вы пишете очень простой аспект:

public aspect SoftenExceptionsInTestCode {

    pointcut inTestCode() : execution(void *Test.test*());

    declare soft : Exception : inTestCode();
}

Аспект в основном говорит, что любой код из Теста (то есть: метод, который начинается с «test» в класс, заканчивающийся на "Test" и возвращающий 'void'), который вызывает исключение, должен быть принят компилятором AspectJ. Если возникает исключение, оно будет заключено в оболочку и выдано компилятором AspectJ как RuntimeException .

В самом деле,

2
ответ дан 5 December 2019 в 20:18
поделиться

I think it is possible with bytecode re-engineering, customized compiler or perhaps aspect oriented programming1. In the contrary to Java, C# has only unchecked exceptions2.

May I ask why you want to suppress the checked exceptions?

1 according to Maarten Winkels this is possible.
2 and they are thinking about introducing checked ones, according to some Channel 9 videos.

Edit: For the question: It is possible in the sense that you can annotate your methods to flag them to be a candidate for checked exception suppression. Then you use some compile time or runtime trick to apply the actual suppression / wrapping.

However, as I don't see the environment around your case, wrapping an exception in these ways might confuse the clients of that method - they might not be prepared to deal with a RuntimeException. For example: the method throws an IOException and your clients catches it as FileNotFoundException to display an error dialog. However if you wrap your exception into a RuntimeException, the error dialog gets never shown and probably it kills the caller thread too. (IMHO).

1
ответ дан 5 December 2019 в 20:18
поделиться

Вы можете сделать это в любом случае, используя тот факт, что Class.newInstance не переносит Exception , создаваемое конструктором no-arg в InvocationTargetException ; скорее он бросает его молча :

class ExUtil {
  public static void throwSilent(Exception e) { //NOTICE NO THROWS CLAUSE
      tl.set(e);
      SilentThrower.class.newInstance(); //throws silently
  }

  private static ThreadLocal<Exception> tl = new ThreadLocal<Exception>();
  private static class SilentThrower {
      SilentThrower() throws Exception {
          Exception e = tl.get();
          tl.remove();
          throw e;
      }
  }
}

Затем вы можете использовать эту утилиту где угодно:

ExUtil.throwSilent(new Exception());
//or
try {
  ioMethod();
} catch (IOException e) { ExUtil.throwSilent(e); }

Кстати, это действительно плохая идея : -)

0
ответ дан 5 December 2019 в 20:18
поделиться
Другие вопросы по тегам:

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