当前位置: 首页 > ai >正文

try catch throw的本质

try catch 本质就是 gotothrow 本质就是 return ,没那么复杂。

你调用函数 foo() bar() ,判断返回值,然后进行错误处理:

...result = foo(...);if (error_occurs(result)) {handle_foo_error...;release_resources...;}...result = bar(...);if (error_occurs(result)) {handle_bar_error...;release_resources...;}...

你嫌麻烦,因为有很多重复语句,比如释放资源,那么你可以用goto语句简化:

...result = foo(...);if (error_occurs(result)) {error = foo_error;goto catch;}...result = bar(...);if (error_occurs(result)) {error = bar_error;goto catch;}...
catch:if (error == foo_error) {handle_foo_error...;} else if (error == bar_error) {handle_bar_error...;}release_resources...;

你还嫌 goto 太老土,或者有没有一种高级版的 goto 可以从内层函数跳出来?那你可以用stdc函数 setjmp() longjmp() ,不过这俩有bug,需慎用。而如果语言支持 try catch throw ,那么就简单多了:

try {result = foo(...); // foo_error在foo()里面throw...result = bar(...); // bar_error在bar()里面throw...
} catch (error) {if (error == foo_error) {handle_foo_error...;} else if (error == bar_error) {handle_bar_error...;}release_resources...;
}

我不喜欢那些让人云里雾里的术语,现在我就来告诉你们编译器/解释器是如何实现的:

首先,会标准化函数返回值,在其中嵌入一个隐藏的 success 布尔值标记, true 表示调用成功,返回值就是函数返回值, false 表示调用失败,那么返回值就是错误值(错误描述、堆栈信息…随便,反正都是值)。 throw 就是 return ,只不过会把 success 置为 false 。编译器/解释器发现如果函数调用处于 try 块里面,那么 successfalse 的时候,就会 gotocatch 块,否则就打印返回值(就是错误值)并退出进程。

c是根本没有上述标准化套路;go lua有,但让你自行处理;三脚猫c++因为不是高级语言,无法在返回值里嵌入隐藏字段,用的是 setjmp() longjmp() ?天晓得;至于java那种还把异常(错误?管它叫什么,反正就是返回值)各种分类,纯属吃饱撑的。

所以总结就是:本质都一样。随你喜好,想用就用,不想用就不用。

http://www.xdnf.cn/news/17112.html

相关文章:

  • Linux《进程间通信(上)》
  • WARN:get Topic [TBW102] RouteInfoFromNameServer is not exist value
  • 使用MatterJs物理2D引擎实现重力和鼠标交互等功能,有点击事件(盒子堆叠效果)
  • [Oracle] NVL()函数
  • 测试单节点elasticsearch配置存储压缩后的比率
  • 河南萌新联赛2025第(四)场【补题】
  • 8月6日星期三今日早报简报微语报早读
  • JAVA无人系统台球茶室棋牌室系统支持H5小程序APP公众号源码
  • 基于跨境电商场景的智能商品管理系统,采用Bootstrap+Django+MySQL技术架构,实现用户行为追踪、智能推荐、多维度商品展示等核心功能
  • 8、项目管理
  • JAVA 程序员cursor 和idea 结合编程
  • Solidity 编程进阶
  • 8.6 JavaWeb(请求响应 P67-P74)
  • PyTorch入门引导
  • Go语言“fmt”包详解
  • 【Linux内核系列】:信号(上)
  • Docker的安装,服务器与客户端之间的通信
  • LeetCode每日一题,8-6
  • springboot项目justAuth扩展第二个小程序
  • Unity轻量观察相机
  • 功能安全和网络安全的综合保障流程
  • 云端软件工程智能代理:任务委托与自动化实践全解
  • CDP集群中通过Hive外部表迁移HBase数据的操作记录
  • 昇思+昇腾开发板+DeepSeek模型推理和性能优化
  • 自己本地搭建的服务器怎么接公网?公网IP直连服务器方法,和只有内网IP直接映射到互联网
  • 线性代数中矩阵的基本运算运算
  • 哲学中的主体性:历史演进、理论范式与当代重构
  • FLAN-T5:大规模指令微调的统一语言模型框架
  • python-自定义抠图
  • OpenSpeedy绿色免费版下载,提升下载速度,网盘下载速度等游戏变速工具