信号(signal)和异常(exception)存在哪些异同?

Oc的异常触发

异常是语言库、接口层面的错误;

信号时系统内核的错误;

 

作者:匿名用户
链接:https://www.zhihu.com/question/20175801/answer/14225549
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

既然提问者已经补充了一些信息,那么我的定义和理解是以下这些:
  • 信号 / signal:软件中断,特指由操作系统发出给应用的异步提示机制,如 Unix signal 。除零错误等 CPU 信号最终仍然被表现为 SIGFPE 信号,否则不在此讨论(如 IRQ 中断等)
  • 异常:按照提问者的补充,为编程语言或环境提供的、同步的错误提示方法,如 C++ / Java 中 throw 的、Python 中 raise 出的对象
Windows 的 SEH(Structured Exception Handling,.aspx)同时包含了以上两种情况,不讨论。
那么两者的区别已经很明显了:
  • 信号由操作系统发出,更为底层,与程序的执行是异步的,由特殊的处理函数进行异步处理(signal / signaction),与程序语言之间几乎没有集成,处理难度更大。
  • (编程语言)异常则由程序语言和运行时提供,是一种可控的、同步激发处理、被语言和运行时支持的、可进行结构化处理的流程控制机制(与 return 和 if else for while 等没有本质区别)。
总的来说,后者处理过程由于是语言直接支持的,难度较小,资源管理较容易,是一种比较「高级」的机制。后者是可以基于前者实现(也可以完全无关)。
除非环境明确要求,一般的程序流程控制只涉及后者;如果环境支持,可能会将 OS 发出的信号包装成对应的异常交给应用处理。
 
https://www.zhihu.com/question/20175801
posted @ 2020-03-19 16:38  zzfx  阅读(801)  评论(0编辑  收藏  举报