C ++ ловит все исключения - PullRequest
212 голосов
/ 25 ноября 2008

Есть ли c ++ эквивалент Java

try {
    ...
}
catch (Throwable t) {
    ...
}

Я пытаюсь отладить код Java / jni, который вызывает собственные функции Windows, и виртуальная машина продолжает падать. Нативный код выглядит хорошо при модульном тестировании и, кажется, только сбой при вызове через jni. Общий механизм перехвата исключений оказался бы чрезвычайно полезным.

Ответы [ 14 ]

4 голосов
/ 25 ноября 2008

Общий механизм перехвата исключений окажется чрезвычайно полезным.

Сомнительный. Вы уже знаете, что ваш код не работает, потому что он падает. Еда исключений может маскировать это, но это, вероятно, приведет к еще более неприятным, более тонким ошибкам.

То, что вы действительно хотите, это отладчик ...

2 голосов
/ 26 ноября 2008
  1. Можете ли вы запустить Java-приложение, использующее JNI, из окна консоли (запустить его из командной строки java), чтобы посмотреть, есть ли какие-либо сообщения о том, что могло быть обнаружено до сбоя JVM. При запуске непосредственно как оконное приложение Java вы можете пропустить сообщения, которые появятся, если вы запустите их из окна консоли.

  2. Во-вторых, можете ли вы заглушить реализацию JNI DLL, чтобы показать, что методы в вашей DLL вводятся из JNI, вы возвращаетесь правильно и т. Д.?

  3. На случай, если проблема связана с неправильным использованием одного из методов интерфейса JNI из кода C ++, вы убедились, что некоторые простые примеры JNI компилируются и работают с вашей установкой? Я имею в виду, в частности, использование методов интерфейса JNI для преобразования параметров в собственные форматы C ++ и преобразования результатов функций в типы Java. Полезно заглушить их, чтобы убедиться, что преобразования данных работают, и вы не собираетесь потерпеть неудачу при COM-подобных вызовах в интерфейс JNI.

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

1 голос
/ 19 января 2010

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

В этом случае часто помогает добавить обертки Java вокруг ваших вызовов JNI (т. Е. Все нативные методы являются закрытыми, а ваши открытые методы в классе вызывают их), которые выполняют некоторую базовую проверку работоспособности (проверяют, что все «объекты» освобождены и «объекты» не используются после освобождения) или синхронизации (просто синхронизируйте все методы из одной DLL в один экземпляр объекта). Пусть методы java-оболочки регистрируют ошибку и выдают исключение.

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

Если вы знаете причину, сохраните код в методах-обертках, чтобы избежать его. Лучше, чтобы ваши методы-оболочки генерировали исключения, чем ваш код JNI, приводящий к сбою виртуальной машины ...

0 голосов
/ 22 апреля 2018

Ну, это действительно зависит от среды компилятора. GCC не ловит эти. Visual Studio и последний Borland, который я использовал, сделали.

Таким образом, вывод о сбоях заключается в том, что это зависит от качества среды разработки.

C ++ спецификация говорит, что catch (...) должен перехватывать любые исключения, но это не во всех случаях.

По крайней мере из того, что я пробовал.

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