D语言中的错误处理

27、D语言风格指南 本文是一篇关于D语言编程风格的全面指南,涵盖了命名约定、代码格式化、注释和文档编写、良好的编程习惯、库与框架使用、特殊语言特性(如模板和混入)、错误处理、测试与调试技巧、代码审查流程以及性能优化策略。通过遵循这些最佳实践,开发者可以提升代码质量、可读性和可维护性,并促进团队协作和项目的长期发展。 阅读详情

D中的错误处理

所有的程序都要应付错误。错误是不在程序正常操作范围内的异常情况:

  • 内存耗尽
  • 磁盘空间耗尽
  • 文件名无效
  • 试图写只读文件
  • 试图读不存在的文件
  • 请求不支持的系统服务

错误处理问题

C 语言检测报告错误的传统方法并没形成传统,每个函数都有自己的方法,包括:

  • 返回 NULL 指针。
  • 返回 0 值。
  • 返回非零的错误代码。
  • 需要检查 errno(译注:错误代码,鉴于此缩写已约定俗成,以下不译)。
  • 如果上述检查失败了,需要调用一个函数。

为了处理可能出现的错误,必须为每个函数添加繁琐的错误处理代码。如果发生了错误,必须有错误恢复代码,并且需要有代码将错误以某种友好的方式告诉给用户。如果不能在发生错误的局部环境处理错误,就必须显式地将错误传播给它的调用者。如果要显示错误类型,需要将一大堆 errno 值转换为合适的文字。这些代码可能占用整个项目编码时间的一大部分,而且如果运行时系统加入了一个新的 errno 值,旧有的代码就不能显示有意义的信息。

功能良好的错误处理代码很容易将清晰而简洁的实现搞得一团糟。

更糟的是,功能良好的错误处理代码本身就很容易出错,还总是整个项目中测试最不充分的部分(因此充满错误),并且还总是被简单地省略。最终的结果就如同“蓝屏死机”那样,程序由于无法处理一些未预料到的错误而失败。

并不值得为 Quick&Dirty 程序编写错误处理代码,因此使用这类程序就好像使用没有锯罩的多功能台式电锯。

我们所需要的是如下的错误处理哲学和方法学:

  • 标准化——如果用法一致,它就更有用。
  • 就算程序员无法查出出现了什么错误,也要使程序以合适的方式终止。
  • 在无需改动旧代码的前提下就可以加入新的错误类型,从而重用旧的代码。
  • 不会由于粗心大意而忽略某些错误。
  • 使 Quick&Dirty 程序能够正确地处理错误。
  • 可以很容易地写出清晰的错误处理代码。

D 的错误处理解决方案

先让我们观察一下并对错误作出以下假设:

  • 错误不属于正常的程序流。错误是异常的、不常见的、不该出现的。
  • 因为错误不常见,所以错误处理代码的性能并不十分重要。
  • 程序的正常逻辑流的性能很关键。
  • 所有的错误必须采用统一的方式处理,不论是显式地编写代码处理它们还是采用系统默认的处理方式。
  • 相比于负责从错误中恢复的代码,负责检测错误的代码拥有更多关于错误的信息。

解决方案是使用异常处理来报告错误。所有的错误都是从抽象类 Error 派生的对象。Error 类有一个叫做 toString() 的纯虚函数,它返回一个 char[] 类型的人类可读的错误描述。

如果代码检测到了一个错误,如“内存耗尽”,则抛出 Error 对象,其中包含消息“内存耗尽”。函数调用堆栈会被展开,并查找 Error 的处理程序。随着堆栈的展开,相应的 finally 块会被执行。如果找到了错误处理程序,就在该处恢复程序的执行。否则,会运行默认的错误处理程序,该程序会显示错误消息并终止程序。

这个解决方案是否能满足我们的要求?

标准化——如果用法一致,它就更有用。
这正是 D 的方法,D 运行时库和示例都采用这种方式。
就算程序员无法查出出现了什么错误,也要使程序以合适的方式终止。
如果没有相应的错误处理程序,程序会执行默认的错误处理程序,该处理程序打印出适当的消息,并使程序优雅的推出。
在无需改动旧代码的前提下就可以加入新的错误类型,从而重用旧的代码。
旧的代码可以决定是捕获所有的错误,或者是只捕获特定的错误并向上传播剩余的错误。无论那种情况,都不必为每个错误代码关联一个消息了,编译器会自动为其提供正确的消息。
不会由于粗心大意而忽略某些错误。
异常会采用这种或那种方式处理。不会出现使用 NULL 指针表示出错,但后面的代码却试图使用该 NULL 指针的情况。
使 Quick&Dirty 程序能够正确地处理错误。
Quick&Dirty 代码根本不需要包含任何错误处理代码,也不需要检查错误。错误会被默认的处理程序捕获,显示适当的消息,然后程序会优雅的终止。
可以很容易地写出清晰的错误处理代码。
try/catch/finally 语句比那些无穷无尽的 if (出错) goto 处理程序; 语句要清晰得多。.

这个解决方案是否符合我们对于的错误的假设?

错误不属于正常的程序流。错误是异常的、不常见的、不该出现的。
D 的异常处理机制完全符合上述假定。
因为错误不常见,所以错误处理代码的性能并不十分重要。
异常处理堆栈的展开相对较慢。
程序的正常逻辑流的性能很关键。
因为正常的代码流不必检查每个函数调用的返回值是否代表出错,使用异常处理来处理错误确实会使程序运行得更快。
所有的错误必须采用统一的方式处理,不论是显式地编写代码处理它们还是采用系统默认的处理方式。
如果某个错误没有对应的处理程序,就会由运行时库中的默认处理程序处理。如果一个错误被忽略了,那一定是程序员特意添加了代码用于忽略这个错误,因此这一定是在程序员意料之中的。
相比于负责从错误中恢复的代码,负责检测错误的代码拥有更多关于错误的信息。
不需要将错误代码翻译为人类可读的字符串,错误检测代码而不是错误恢复代码负责生成正确的字符串。这种做法也使不同的程序出现相同的错误时会输出相同的消息。
20、掌握D语言中的goto语句:深度解析与实战指南 本文深入解析了D语言中的goto语句,包括其基本语法、应用场景及潜在风险。通过实战示例展示了在错误处理和状态机等场景中如何使用goto简化逻辑,并讨论了其可读性限制及替代方案,如函数拆分和异常处理机制。文章还提供了优化技巧、调试维护建议以及实际项目应用案例,帮助开发者合理利用goto语句的优势,同时规避其带来的复杂性和潜在问题。 阅读详情

相关推荐

2、D语言编程基础入门

本博客为D语言编程的基础入门指南,详细介绍了如何编译和运行第一个D语言程序'Hello, World!',讲解了D语言的基本概念如编译器使用、关键字、基本数据类型、函数(如writeln和write)、类型属性及其应用等内容。此外,还提供了实践建议、学习路径规划和相关资源推荐,帮助读者从零开始掌握D语言编程。

mm9012的博客 71

“D语言风采不再”的说法言过其实

 随着 TOIBE 发布新一轮的排行榜,这种说法开始甚嚣尘上。个人觉得媒体炒作要有度,不能文过饰非。D 语言2007年1月推出正式版的D语言以C++替代者的形象出现在程序员的视野,成长迅速,怎么可能突然就风采不再了呢?套用一句“股市专家”的专用词,这不过是一个技术性调整。从上图看,07年开始 D 语言一直是稳中略升,事实上在08年下半年到09年4月间的编程语言排行榜中一直保持着第十二名的位

赖勇浩的编程私伙局 9678

D语言特性及开发简介

D语言是由Digital Mars公司开发的编程语言,起因是为了改进C++。它与C二进制兼容(不完全),可编译为本地码,有GC也可手动管理内存,语法上借鉴多种语言,模板则在C++的基础上做了相当大的扩充。D 语言既有 C 语言的强大威力,又有 Python 和 Ruby 的开发效率。它是一种集垃圾回收、手工内存操作、契约式设计、高级模板技术、内嵌汇编、内置单元测试、Mixin 风格多继承、类 Java 包管理机制、内置同步机制、内建基本运行时信息的系统级编程语言

d语言的经验教训

1,无预处理器 2,变长统一码.其余代码页,ebcdic,jis,..用正字节 3,utf16,ucs2是鸡肋==>不一定.utf16还是可以的.还是gbk与utf8间的竞争. 4,>=32位机器.c写16位最好. 5,X:位数据类型,超过1个指针类型,没必要.如bit a;bit*p=&a; 6,固定整数据大小. 7,8进制,没必要!用库就行了. 8,二进制字面量,没必要.几...

个人进步之路 1640

别再只调API了!深度拆解Dify文件上传的两种传参方式(sys.file vs. inputs.upload_file)

本文深度解析Dify平台文件上传的两种传参方式——sys.file与inputs.upload_file,详细对比其设计原理、技术实现及适用场景。通过代码示例和性能分析,帮助开发者在本地大模型应用中做出精准技术选型,提升文件处理效率与系统稳定性。

weixin_29063979的博客 268

单细胞分析避坑指南:你的Harmony批次矫正真的做对了吗?

本文深入探讨了单细胞转录组分析中Harmony批次矫正的正确使用方法,解析了其工作原理及常见误区。通过详细参数调优指南和实战案例,帮助研究者避免过度矫正,确保生物学信号的有效保留。特别关注Harmony在单细胞数据分析中的关键参数设置和结果验证方法。

weixin_31099291的博客 299

D语言环境配置的一个问题

D语言已经听说了一段时间,一直都没有静下心来研究。今天有时间,就看了一下。先是下载了D语言的编译器DMD和DMC,然后就是配置环境了,先按照说明,将配置环境定义好,写了一个简单的代码: void main(){printf ("Hello world! ");}不要误会,这个确实是D语言,不过看上去和C/C++很像,简直就是一个模子里出来的。现在编译一下就可以了。可是现

builder的专栏 1003

【白话系列】倍增算法

【序言】         我认为吧,所有能够优化复杂度的算法都是神奇的,所有能够化繁琐为形象的文字都是伟大的。一直觉得倍增算法是个很神奇的东西,所以决定写点东西纪念一下它。但是作为一个非常不称职的OIER,我非常讨厌在看别人的算法解析时整版的i,j,k等我看到鼠标就惯性移到右上角的符号语言,所以我想用最形象的方式来纪念它。 【一】         从前,有一只可爱得不得了的小白兔,它想从

JarjingX 3万+

被误解的C++——C++的缺陷和D的缺陷

C++的缺陷和D的缺陷D语言,从字面上讲应当是在C/C++的基础上进了一位,其特性当然也进了一位。真是这样?也是,也不是。这得看你的出发点和价值观了。D的定位在于继承C/C++的优势,但却更加易学易用。这种定位招人喜爱。C/C++的致命伤就在难学难用上。(不少人认为C++难学易用,我也持这种观点。但是既然要拿来同D比较,那我也只能跳一回票。只此一次,下不为例)。我大致了解了一下D的特性

longshanks的专栏 6043

【AutoDL】使用云服务器跑深度学习代码

1.算力市场 租用服务器,选择自己心仪的服务器2.镜像可以选择一些基础的镜像,社区镜像里是git上有的环境。3.上传文件在文件存储中,选择上传的区,在右边点击上传,选择自己的文件上传到云服务器中。

weixin_45768644的博客 3702

基于LightGBM和多模型融合的量化交易研究:沪深300为例【附代码】

📊 数据科学与大数据专业 | 数据分析与模型构建 | 数据驱动决策✨ 专业领域:数据挖掘与清洗大数据处理与存储技术机器学习与深度学习模型数据可视化与报告生成分布式计算与云计算数据安全与隐私保护💡 擅长工具:Python/R/Matlab 数据分析与建模Hadoop/Spark 大数据处理平台SQL数据库管理与优化Tableau/Power BI 数据可视化工具TensorFlow/PyTorch 深度学习框架✅数据科学与大数据技术毕业论文【数据】

lagougongzuoshi的博客 1670

D 中的错误处理 2.014

无版本差异 我来了,我编码了,我崩溃了。-- Julius C'ster 所有的程序都要应付错误。错误是不在程序正常操作范围内的异常情况:常见的错误情况 有: • 内存耗尽。 • 磁盘空间耗尽。 • 文件名无效。 • 试图写只读文件。 • 试图读不存在的文件。 • 请求不支持的系统服务。 21.1 错误处理问题 C 语言检测报告错误的传统方法并没形成传统,每个函数都有...

hqs7636的专栏 134

YOLOv11【第二章:核心模块进阶篇·第3节】LDConv线性可变形卷积改进YOLOv11!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 7440

d中异常与错误

d中异常与错误

个人进步之路 240

十分钟搞定! DeepSeek本地部署详细指南!

保姆级教程,三步搞定deepseek本地部署,不求人!

一个喜欢诗和远方的程序媛 4347

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Tree.d 项目推荐

Tree.d 项目推荐 1. 项目基础介绍和主要编程语言 Tree.d 是一个开源项目,主要使用 D 语言开发。该项目旨在提供一种简单、快速、紧凑且用户可读的二进制安全扩展结构化格式,称为 Tree 格式。Tree 格式的设计目标是比传统的 JSON、XML、YAML 和 INI 格式更具优势,特别是在可读性、编辑友好性、深层层次结构、实现简单性、性能、大小和流处理等方面。 2. 项目的核心功能 ...

gitblog_00084的博客 543

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

16用d编程编程环境

main()可有string[]参数 可用std.getopt取命令. import std.stdio; import std.getopt; import std.random; void main(string[] args) { int count; int minimum; int maximum; getopt(args,"count", &...

个人进步之路 400

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

d作者d语言中组件式编程

D编程语言中组件编程 作者:沃尔特.布莱特(Walter Bright) 我们一直在尝试编写可重用软件.作者35年的编程经验,但可重用的很少.复制/粘贴不算,我在某处可能错过了,其他程序员也经常有同样感觉.不是缺少实践,也不是现在比过去强,应该有深入理解. 有问题的样儿:抽象有漏洞,依赖其他代码,组件太具体(对A适用,但对B不适用),要回到问题: 什么是组件? ● 不仅仅是可重用软件,有很多非真正组件的可重用代码库. ● 组件有预定义接口.这样,即使单独开发的,也可交换,添加和组合他们. ● 多数库暴露接口

个人进步之路 467

d语言更改日志.

0 给串加别名. 加.idup创建不变副本 加常/不变/止. 每一值变量现在默认为止 类和构不变声明现在必须有() 1 .init基于类型,而非初始值. 3 加外(系统) 加标.特征 4 加-debuglib和-defaultlib命令行开关. 允许多模块静态构造/析构函数 6 各种串改为不变. 对函数和模板实现了重载集 7 传递常尾不变. 重载一元*. 支持完整闭包. 8 std.functional|typecons等新模块 构/类/接口可为常. typeof(return), 改变分析覆盖方式 9 重

个人进步之路 817

The D Programming Language(目录)

Table of Contents Copyright Preface Chapter 1. “D”iving In Section 1.1. Numbers and Expressions Section 1.2. Statements Section 1.3. Function Basics Section 1.4. Arrays and Associative Arrays Section ...

yntcsb的专栏 219

d作者:d的新特性

d的新特性

个人进步之路 195

D-YAML项目使用常见问题解答

D-YAML项目使用常见问题解答 项目基础介绍和主要编程语言 D-YAML是一个开源的YAML解析器和发射器库,专为D编程语言而设计。它几乎完全符合YAML 1.1规范,并且基于Kirill Simonov创建的PyYAML。D-YAML旨在易于使用,同时支持YAML的全部特性集。 新手使用项目的注意事项及解决步骤 注意事项1:安装与配置 新手在安装和配置D-YAML时,可能会遇到路径或配置问题,...

gitblog_01058的博客 323

Diablo II 文件格式解析器:d2s 项目推荐

Diablo II 文件格式解析器:d2s 项目推荐 Diablo II 是一款经典的动作角色扮演游戏,而 d2s 项目是一个开源的 Go 语言编写的二进制解析器,用于解析 Diablo II 的角色文件(d2s 格式)。以下是关于这个项目的详细介绍。 1. 项目基础介绍与主要编程语言 d2s 是一个专门针对 Diablo II 角色文件格式设计的二进制解析器。它以 MIT 许可证开源,项目托管在...

gitblog_01122的博客 626

basic-computer-games 中的 D 语言移植:Acey Ducey 的内存安全重构实践

本指南围绕 classic "Basic Computer Games" 项目中的 Acey Ducey 纸牌游戏,讲解其 D 语言移植版 `00_Alternate_Languages/01_Acey_Ducey/d/` 目录下的双版本设计:一个是对原始 BASIC 的字面直译(`aceyducey_literal.d`),一个是惯用 D 语言的优雅重构(`aceyducey.d`)。读者读完本

gitblog_00873的博客 7
上一篇: D语言中的调试、版本控制和静态断言
下一篇: D语言中的垃圾收集机制
uframer
博客等级 码龄22年 16粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值