从处理程序捕获时如何获取 Ada 异常消息C++?
how to get Ada exception message when catching from C++ handler?
使用 GNAT Ada 和 Gnu C++,我正在将一段 Ada 代码与 c++ 包装器接口,我想在运行此(愚蠢(代码时正确捕获 Ada 异常:
with ada.text_io;
package body ada_throw is
procedure ada_throw is
begin
ada.text_io.put_line ("hello");
raise program_error;
end ada_throw;
end ada_throw;
相关规范代码为:
package ada_throw is
procedure ada_throw;
pragma export (convention => C, entity => ada_throw, external_name => "ada_throw");
end ada_throw;
在C++方面这样做:
#include <iostream>
extern "C"
{
void ada_throw();
void adainit();
}
int main()
{
adainit();
ada_throw();
std::cout << "end of program" << std::endl;
return 0;
}
我得到这个:
hello
raised PROGRAM_ERROR : ada_throw.adb:8 explicit raise
所以异常机制有效,我没有获得C++程序的最后一次打印,并且返回代码不为零。
现在我想抓住异常。如果我使用catch(...)
它可以工作,但我无法再收到明确的错误消息,所以我尝试了这个:
#include <iostream>
#include <cxxabi.h>
extern "C"
{
void ada_throw();
void adainit();
}
int main()
{
adainit();
try
{
ada_throw();
}
catch (abi::__foreign_exception const &e)
{
std::cout << "exception" << std::endl;
}
std::cout << "end of program" << std::endl;
return 0;
}
它工作正常,我得到:
hello
exception
end of program
唯一的问题是abi::__foreign_exception
没有what()
方法,所以我无法掌握有意义的错误消息。
调试程序以尝试入侵e
也是一个死胡同,因为它只是一个具有正确类型的空指针:
(gdb) p &e
$2 = (const __cxxabiv1::__foreign_exception *) 0x0
有没有办法从C++那里得到它?
在 Ada 中,您可以使用函数Ada.Exceptions.Exception_Name
和Ada.Exceptions.Exception_Message
获取有关异常发生的信息,它们是标准库的一部分。 一种选择是为这两个函数提供精简绑定,并在需要有关异常的信息时调用它们。 (确切地说,如何将abi::__foreign_exception
映射到Ada.Exceptions.Exception_ID
留给读者练习。
另一种选择是向 Ada 编译器明确表示您正在另一端编写C++,并使用CPlusPlus
而不是C
作为导出约定。 这可能会使编译器提供异常,C++理解。
这只是一个部分答案,因为我对C++非常不熟悉,但我希望它能帮助你朝着正确的方向前进。
根据你想对C++世界中的异常做什么,在 Ada 中编写包装器可能更容易/更干净,它会调用ada_throw
并处理任何异常。然后只需从C++调用此包装器即可。
如果C++代码必须看到异常并知道发生了什么,则包装器可以提供类似于what()
方法,并重新引发相同或新的(自定义(异常。
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- 如何获取std::result_of函数的返回类型
- 如何在openssl-ecc中获取十六进制格式的私钥
- 使用Unreal C++获取VR耳机的世界位置/方向
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 从C字符串中获取奇怪的字符串长度
- 为什么我的for循环不能正确获取argv
- 从python中调用C++函数并获取返回值
- 如何获取一个数字的前3位
- 获取字符串的长度并将其分配给数组
- 无法获取菜单选择以运行函数.C++
- 数组长度,为什么从命令行获取时不能使用它?
- Boost Spirit,获取迭代器内部语义动作
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 具有默认值的引用获取函数
- xmake总是报告:错误:无法获取cxx的程序,为什么
- 从处理程序捕获时如何获取 Ada 异常消息C++?