c++ - 在 C++ 绑定中捕获 fortran 运行时错误和信号
问题描述
我希望能够在 C++ 绑定中捕获终止的 Fortran 运行时错误。我有一个旧的 F90 代码可以绑定并期待各种错误,例如数字、IO 等。
我设法根据以下内容处理 STOP: Intercepting Fortran STOP from C++ and able to throw/catch exception for this case in the C++ code。
我在 https://www.sharcnet.ca/help/images/4/42/Fortran_Signal_Handling.pdf对“Fortran 中的信号处理”有了一些了解
但是,我无法解决这个问题,f90 fortran 的示例将非常有帮助。
例如,尝试在 fortran 子例程中打开一个不存在的文件会产生运行时错误,并且 C++ 代码会终止:
打开 (unit=13,FILE="fnameBAD",status="old",action="read",position="rewind")
Fortran 运行时错误:无法打开文件“fnameBAD”:没有这样的文件或目录
我希望能够使用信号捕获这个和其他运行时错误。
解决方案
这行不通,至少对 GFortran 来说是这样。当 thenOPEN
语句失败时,GFortran 运行时库将自行关闭,并且仅在最后生成信号。因此,当您可以在信号处理程序中捕获信号时,libgfortran 已经自行关闭(包括关闭所有打开的文件)。
正如 Vladimir F 在评论中所说,解决方案是使用说明符捕获OPEN
语句中的错误iostat=
。
推荐阅读
- windows - 停止 Windows 服务并等待它自行停止,而不是在 +-15 秒后被 Windows 杀死
- php - 合并两个 SELECT 语句并返回一个 JSON 响应
- sql - 同一张表的子查询
- sql-server - EF Core查询多对多关系之间的完全联接
- django - 流浪者,Centos7,Nginx,Uwsgi,Django。SSH + Nginx 连接重置然后连接被拒绝
- rabbitmq - 将消息从 RabbitMQ 分发给在 Heroku dynos 上运行的消费者作为“循环”
- python - 将当前登录的用户分配为模型字段的默认值
- php - 用随机值填充数组,然后计算它们
- java - 调试动态代理创建会改变调用处理程序状态
- c++ - 在模板参数包上使用类型特征?