Я пытаюсь выполнить обработку ошибок в байт-коде Java. Сначала я попытался реализовать некоторые подпрограммы типа «ловушка», в которых я проверял бы состояние ошибки и переходил к соответствующей подпрограмме, что-то вроде:
iconst_1
iconst_0
dup
ifeq calldiverr
goto enddivtest
calldiverr:
jsr divError
enddivtest:
idiv
...More instructions...
divError:
getstatic java/lang/System/out Ljava/io/PrintStream;
ldc "Oh dear you divided by 0!"
invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
Проблема с вышесказанным заключается в том, что когда у меня есть несколько инструкций, которые переходят к этой подпрограмме, я получаю сообщение об ошибке при запуске байт-кода, говорящее о том, что высота стека не соответствует.
Возможно, использование исключений - лучший способ обойти это?
Из некоторых поисков я обнаружил, что вы можете создавать экземпляры классов Exception и инициализировать их что-то вроде:
new java/lang/Exception
dup
ldc "exception message!"
invokespecial java/lang/Exception/<init>(Ljava/lang/String;)V
Я также обнаружил, что вы можете бросить их с помощью athrow
, и это выглядит нормально.
Однако меня смущает именно то, как ловятся исключения. Кажется, есть волшебная «Таблица исключений», которая склеивает создание и отлов исключений, но я не знаю, как определить одно из них при написании байт-кода с нуля (и при сборке с использованием Jasmin). Может кто-нибудь сказать мне секрет создания таблицы исключений? И, возможно, приведите пример обработки исключений, которая будет собираться с помощью jasmin?