首页 > 编程语言 >对比编程语言的四种错误处理方法,哪种才是最优方案?

对比编程语言的四种错误处理方法,哪种才是最优方案?

时间:2023-05-08 21:44:49浏览次数:47  
标签:函数 编程语言 代码 哪种 result error 错误处理 异常

作者:Andrea Bergia

译者:豌豆花下猫@Python猫

英文:Error handling patterns

转载请保留作者及译者信息

错误处理是编程的一个基本要素。除非你写的是“hello world”,否则就必须处理代码中的错误。在本文中,我将讨论各种编程语言在处理错误时使用的最常见的四种方法,并分析它们的优缺点。

关注不同设计方案的语法、代码可读性、演变过程、运行效率,将有助于我们写出更为优雅和健壮的代码。

返回错误代码

这是最古老的策略之一——如果一个函数可能会出错,它可以简单地返回一个错误代码——通常是负数或者null。例如,C 语言中经常使用:

FILE* fp = fopen("file.txt" , "w");
if (!fp) {
  // 发生了错误
}

这种方法非常简单,既易于实现,也易于理解。它的执行效率也非常高,因为它只需要进行标准的函数调用,并返回一个值,不需要有运行时支持或分配内存。但是,它也有一些缺点:

  • 用户很容易忘记处理函数的错误。例如,在 C 中,printf 可能会出错,但我几乎没有见过程序检查它的返回值!
  • 如果代码必须处理多个不同的错误(打开文件,写入文件,从另一个文件读取等),那么传递错误到调用堆栈会很麻烦。
  • 除非你的编程语言支持多个返回值,否则如果必须返回一个有效值或一个错误,就很麻烦。这导致 C 和 C++ 中的许多函数必须通过指针来传递存储了“成功”返回值的地址空间,再由函数填充,类似于:
my_struct *success_result;
int error_code = my_function(&success_result);
if (!error_code) {
  // can use success_result
}

众所周知,Go 选择了这种方法来处理错误,而且,由于它允许一个函数返回多个值,因此这种模式变得更加人性化,并且非常常见:

user, err = FindUser(username)
if err != nil {
    return err
}

Go 采用的方式简单而有效,会将错误传递到调用方。但是,我觉得它会造成很多重复,而且影响到了实际的业务逻辑。不过,我写的 Go 还不够多,不知道这种印象以后会不会改观!

标签:函数,编程语言,代码,哪种,result,error,错误处理,异常
From: https://www.cnblogs.com/pythonista/p/17383258.html

相关文章

  • 在编程语言越来越高级的情况下,程序员学习汇编有什么意义?
    汇编(Assembly)是一种计算机编程语言,用于编写计算机程序。与高级编程语言不同,汇编语言更接近计算机硬件的语言,可以直接控制计算机的底层操作。汇编语言使用助记符来表示指令和操作数,这些助记符可以被转换成计算机能够理解的机器语言指令。汇编语言编写的程序通常比高级语言编写的程序......
  • 您在飞行程序设计时使用哪种软件?
    最近填了一份调查问卷,里面提到飞行程序设计时所使用的软件,除了CAD之外,我很想说我用自己写的插件。我用自己写的插件,并不是因为这个插件有多么完美,而是因为,通过插件的开发,可以实现个人经验的积累,在可控的精准度下,提高工作效率,并尝试更多的可能性。苏世民《我的经验与教训......
  • MLIR 新编程语言MOJO
    什么是MLIR?MLIR是程序的中间表示,与汇编语言没有什么不同,在汇编语言中,一组连续的指令对内存中的值进行操作。更重要的是,MLIR是模块化和可扩展的。MLIR由越来越多的“方言”组成每种方言都定义了操作和优化:例如“数学”方言提供数学运算,如正弦和余弦运算阿姆德普方言提供特定于A......
  • 编程语言MOJO特点
    全新编程语言Mojo:兼容Python核心功能可与Python无缝衔接,但克服了很多Python的缺点「Mojo结合了Python的可用性与C的性能,释放了AI硬件无与伦比的可编程性和AI模型的可扩展性」——它与Python一样易于使用,但具有C++和Rust的性能。此外,Mojo提供了利用整个Pytho......
  • 面向过程编程语言特点
    面向过程的编程语言也称为结构化程序设计语言,是高级语言的一种。在面向过程程序设计中,问题被看作一系列需要完成的任务,函数则用于完成这些任务,解决问题的焦点集中于函数。面向过程的编程语言采用自顶向下、逐步求解的程序设计方法,使用三种基本控制结构构造程序,即任何程序都可由顺......
  • 编程语言的通用架构——不同的编程语言之间是否存在共性或者说共通之处?能否学会一种编
    本文重点解决如下问题:不同的编程语言之间是否存在共性或者说共通之处?能否学会一种编程语言之后,即可触类旁通的学会其它编程语言?即本文重点描述了不同编程语言之间的通用架构。需要指出的是,为便于读者理解,使用了编程语言的通用架构这一说法,实际上要归纳出种类繁多的编程语言的通用......
  • 不同的编程语言中使用管道pipe(或者说链式调用)
    目录终端语言(如bash,zsh)一般有管道符|pythonjavascriptrubymathematicac#c++scala3终端语言(如bash,zsh)一般有管道符|#将`echo`命令的输出传递给`grep`命令echo"Hello,World!"|grep"World"#将`ls`命令的输出传递给`wc`命令,以统计文件和目录的数量ls|wc......
  • 云原生时代崛起的编程语言Go常用标准库实战
    @目录基础标准库简述字符串-string底层结构函数长度格式化输出模版-templatetext/templatehtml/template正则表达式-regexp编码-encodingBase64JSONXML时间-time网络-netURLHTTP客户端和服务端加密IO操作读写文件环境变量命令行数据库排序-sort测试和基准测试基础标准库简述Go......
  • 01_java面向对象编程语言的思考
    java的跨平台在各个操作平台上,有一层JVM(java虚拟机),这是支撑java程序能够运行的基础。java源代码→(编译)→java字节码→(运行)→java虚拟机jdk:java开发工具包jre:java运行环境jvm:java虚拟机api:应用程序接口程序目录主要结构lib目录:存放Java的类库文件bin:java编译器,解释器工具......
  • 云原生时代崛起的编程语言Go并发编程实战
    @目录概述基础理论并发原语协程-Goroutine通道-Channel多路复用-Select通道使用超时-Timeout非阻塞通道操作关闭通道通道迭代定时器-TimerAndTicker工作池-WorkerPools等待组-WaitGroup原子操作-Atomic互斥锁-Mutex读写互斥锁-RWMutex有状态协程单执行-Once条件-Cond上下文-Conte......