我在 Android 上有以下代码:
try {
LOGI("OP SQLITE 🟦", "Before exception");
throw std::runtime_error("Test exception");
} catch (const std::exception &exc) {
auto what = exc.what();
LOGE("OP_SQLITE ERROR 🟥", what);
} catch (const std::runtime_error &exc) {
LOGE("OP_SQLITE ERROR 🟠", "Blah");
}
在我的日志上:
17:04:15.539 I OP SQLITE 🟦
17:04:15.539 E OP_SQLITE ERROR 🟠
在 iOS 上,第一个捕获可以正确捕获异常,但在 Android 上,只有第二个捕获能够捕获错误。我想要一个适用于所有平台的捕获。我正在使用 NDK 的最新版本,并且还在我的
build.gradle
: 中使用共享 libc
cppFlags "-std=c++17", "-frtti", "-O2", "-fexceptions", "-DONANDROID"
abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
arguments "-DANDROID_STL=c++_shared",
"-DSQLITE_FLAGS='$sqliteFlags'",
"-DUSE_SQLCIPHER=${useSQLCipher ? 1 : 0}",
"-DUSE_CRSQLITE=${useCRSQLite ? 1 : 0}",
"-DUSE_LIBSQL=${useLibsql ? 1 : 0}",
"-DUSE_SQLITE_VEC=${useSqliteVec ? 1 : 0}",
"-DUSER_DEFINED_SOURCE_FILES=${sourceFiles}",
"-DUSER_DEFINED_TOKENIZERS_HEADER_PATH='${tokenizersHeaderPath}'"
在我的 cmakelists.txt 上:
set (PACKAGE_NAME "op-sqlite")
set (CMAKE_CXX_STANDARD_REQUIRED ON)
set (CMAKE_CXX_EXTENSIONS OFF)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -fexceptions -frtti -stdlib=libc++")
set (BUILD_DIR ${CMAKE_SOURCE_DIR}/build)
有什么想法可能是错的吗?
编辑:
查看 std::runtime_error 的定义,我看到了这一点,所以看起来它的定义是正确的
事实证明这是 React Native 上的一个问题。尽管我的代码是正确的,但内部有些东西被破坏了,但是runtime_error没有被正确映射到通用的std::exception。