异常处理:Go vs Java vs CPP

错误处理是必须要面对的一个问题,错误又包括编译时、运行时错误,编译时错误可以在编译器处理阶段发现,运行时错误就要依赖语言提供的错误处理机制来捕获,像C++、Java都提供了try-catch的能力,Go里面没有try-catch,但是提供了panic & recover的机制来模拟异常处理。

那么这几种方式的差别是什么呢?

  • 控制流执行方式不同 try { codeblock } catch (ex e1){ handle e1 } catch (ex e2){handle e2},只有当codeblock抛出异常且被catch时对应的错误处理代码才会执行,但是panic、recover不同,defer func() { e := recover ...}()注册的函数在函数退出阶段一定会执行;

  • 异常的传播方式不同 try-catch错误处理代码是在catch之后的block进行,如果没有被catch到则会继续向上层抛出异常等上层捕获处理……如果最终没有被catch并处理,则进程挂掉。panic的抛出有别于异常向上抛出的过程,某个goroutine中产生的panic只可以在当前goroutine结束前recover,如果当前goroutine没有recover处理该panic,则进程立即挂掉。

  • 异常的处理方式不同 try-catch捕获了异常、处理之后依然继续走后续流程,就好像什么都没有发生过一样,但是panic会立即unwind the calling stack并层层返回并直到被recover捕获后,上层调用函数才可以重新恢复向下执行。

您的支持,是我继续创作、分享知识的动力。如果您认为本文不错,请点赞、转发、赞赏 :)

你可能感兴趣的:(异常处理:Go vs Java vs CPP)