Fortran Coder

查看: 99|回复: 5

[讨论] fortran中有没有能实现捕捉异常的机制

[复制链接]

137

帖子

12

主题

0

精华

大宗师

F 币
3592 元
贡献
607 点
发表于 2020-1-15 07:47:35 | 显示全部楼层 |阅读模式
其实这个问题,我很久之前在别人的帖子里问过,但是这次还是想问一次
问题是这样的,我们写的很多子进程或者函数可能会碰到输入参数不合适导致计算错误的
例如一个计算逆矩阵的子进程,碰到了输入是一个奇异矩阵
这里标准的方法当然是说你参数里就给一个错误代号,在子进程里碰到异常就给错误代号赋值然后结束

但是大家可以看到,这种方法一旦子进程多层嵌套,你就不得不一层层上抛错误代号,而且子进程调用看起来也会很累赘
所以我一度写代码的时候,碰到这种完全无法计算的异常的时候,我会直接写STOP或者ERROR STOP语句
不过我看查普曼的书,一直很反对这样的写法
因此我就想问,在fortran里有没有既能把子进程写的简单利落,又能捕捉到极少数这种异常的办法
就像python或matlab做矩阵求逆之类的函数也不会搞的那么累赘啊

曾经有位大佬似乎回复过我,说对这种问题主流的办法是类似于python的        try...exception...    的写法
当然他说的似乎是C或者C++的说法,和我写的形式不一致,但意思应该差不多
那么在fortran里有没有这样的机制或者办法呢?

回复

使用道具 举报

1487

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1099 元
贡献
756 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2020-1-15 09:24:48 | 显示全部楼层
语法没有异常捕获机制。

137

帖子

12

主题

0

精华

大宗师

F 币
3592 元
贡献
607 点
 楼主| 发表于 2020-1-15 12:10:37 | 显示全部楼层
fcode 发表于 2020-1-15 09:24
语法没有异常捕获机制。

谢谢
那么对于我说的那种情况,有没有什么好的替代办法?
难道只能用一个错误代号层层上抛?

1487

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1099 元
贡献
756 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2020-1-15 19:43:03 | 显示全部楼层
确实没有好的办法。

其他语言有错误捕捉机制,是建立在它们的应用场景中大多数操作是可撤销的。
所以,捕捉到异常,可以撤销掉最近的操作,进而返回之前的某个最近的“正常”状态。

但科学计算通常是不行的,很过过程没法存在合理的、明确的反过程。

因此,科学计算领域对异常捕捉的需求也不大。

1487

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1099 元
贡献
756 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2020-1-15 19:44:38 | 显示全部楼层
python我没学过。反正 C++ 的异常捕捉,其实只是逻辑上好理解一些。
要写得完善了,真的很麻烦。一点不比一层一层返回轻松。

137

帖子

12

主题

0

精华

大宗师

F 币
3592 元
贡献
607 点
 楼主| 发表于 2020-1-16 01:14:19 | 显示全部楼层
fcode 发表于 2020-1-15 19:44
python我没学过。反正 C++ 的异常捕捉,其实只是逻辑上好理解一些。
要写得完善了,真的很麻烦。一点不比一 ...

好的,看来是没有什么别的好办法了
非常感谢版主~
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2020-2-28 04:36

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表