返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++的另一种错误处理策略是什么
  • 215
分享到

C++的另一种错误处理策略是什么

2023-06-17 07:06:02 215人浏览 八月长安
摘要

c++的另一种错误处理策略是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。这篇短文是讨论一个大多数程序员都感兴趣的一个话题:错误处理。错误处理是编程的一个“黑暗面”。它

c++的另一种错误处理策略是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

这篇短文是讨论一个大多数程序员都感兴趣的一个话题:错误处理。错误处理是编程的一个“黑暗面”。它既是应用程序的“现实世界”的关键点,也是一个你想隐藏的复杂业务。

在早期的C编程生涯中,我知道三种错误处理的方式。

C语言的方式:返回错误码

C语言风格的错误处理是最简单的,但是并不***。

C语言风格的错误处理依赖于“当程序遇到错误时返回一个错误码”。这里是一个简单的例子:

int find_slash(const char *str) {     int i = 0;        while (str[i] && str[i] != '/')           i++;        if (str[i] == '\0')         return -1; //Error code        //True value     return i; }    // . . .    if (find_slash(string) == -1) {         //error handling }

使用这种方式的有什么好处?

你可以在调用函数之后直接处理错误码(在C语言中,你也会这样处理),显示一个错误消息或者直接终止程序。或者仅仅恢复程序最近的一个状态,终止计算。

当你找不到错误处理在哪里的时候,你只需要后头看看函数调用,错误处理就在那个附近。

使用这种方式有什么不好?

有人可能会告诉你,这种异常/错误处理方式和“执行逻辑”混在了一起。当你顺序地阅读这些代码的时候就行程序执行一样,你看到了一会错误处理,一会程序执行。这样很糟糕,你可能更喜欢只读程序执行逻辑或者错误处理逻辑。

并且你被限定使用错误码,如果你想要提供更多的信息,你需要创建一些功能函数比如:errstr或者提供全局变量。

使用C++的方式

C++作为对C的增强,引入了一种新的错误处理方式——异常。异常通过抛出一个错误的方式来中断正常代码执行逻辑,并可以被其他地方所捕获。下面是一个简单的例子:

int find_slash(const char *str) {     int i = 0;        while (str[i] && str[i] != '/')           i++;        if (str[i] == '\0')         throw AnException("Error message");        //True value     return i; }    // . . .    try {     find_slash(string); } catch(AnException& e) {    //Handle exception }

这样做的好处?

程序逻辑和错误处理分离了。一边你可以看到函数是如何工作的,而另一边你可以看到函数失败时候是怎么处理的。这样做很***,可以很容易看出错误处理和正常程序逻辑。

另外,现在你可以为你的错误提供你需要的尽可能多的信息,因为你可以将需要的内容填充在自定义异常对象里。

这样做的坏处

编写详尽的异常处理变得很冗。你需要一个异常树,但是***不要太大,这样,你可以选择捕获感兴趣的异常。同时,内部需要提供错误码,来获知究竟发生了什么,同时需要检索一些错误消息,等等。编写写异常类通常都是冗长,这是将信息嵌入到错误里来灵活处理更多的信息的成本。

这里的错误处理哲学是将错误尽可能推迟到需要处理的地方再处理,当你不知道程序执行过程究竟哪里会产生一个错误,你需要跳过不同的文件和功能函数来 查找,这通常都是困难的,如果你在一个很深的调用树(这里意思是当你将函数调用绘制出一个图形,其形状类似一棵树)上引发了一个异常,你需要指定在哪里来 处理这个异常,当它被处理的时候,它又是在哪里发生的。特别是当你的程序很大,又是很早之前编写,有恰巧设计不够良好的时候,就更加显得困难。而大多数商 业项目都是这样。

所以我觉得“异常是危险的”。虽然它提供了一种良好的方式来处理错误——仅限于一些小项目,并且这里的调用图简单且易于掌握时候。

错误封装的模式

我这里把它叫做一种模式,所以人们不必害怕担心。后面,我会给它一种更好的命名,所以请不要着急。

错误封装的主旨是创建一种封装来包含错误消息或者错误的返回值。我们通常会选择字符串而不是其他,因为这也并不容易实现。我们尽力保证语法的可读性,可理解,并且容易应用。我们不处理拷贝构造或者多参数函数及返回值,这里仅给出一个尽可能简单的例子。

让我们以下面的例子开始:

E<int> find_slash(const char* str) {     int i = 0;        while (str[i] && str[i] != '/')           i++;        if (str[i] == '\0')         return fail<int>("Error message");        //True value     return ret(i); }    // . . .    auto v = find_slash(string); if(!v) {     //Handle exception }

乍一看,这里有点类似C语言的风格,但是不是,为表明这一点,请看接下来的多个函数调用例子:

E<int> find_slash(const char*); E<int> do_some_arithmetic(int); E<std::string> fORMat(int); E<void> display(std::string);    auto v = ret(string)          .bind(find_slash)          .bind(do_some_arithmetic)          .bind(format)          .bind(display);    if(!v) {     //Handle error }

好了,这里发生了什么?bind是一个成员函数来绑定你的函数调用,试着去应用它。如果错误装箱里面含有一个值,那么它就应用于函数调用,继续返回一个错误装箱(编译器不允许你返回一个不带错误装箱的函数)。

所以,我们链式调用了find_slashe,do_some_arithmetic, format和display.它们都不处理错误装箱,由于bind函数的作用,我们将函数E<something_out> f(something_in)返回结果给E<something_out> f(E<something_in>)函数做参数。

这里的好处是什么?

再一次,函数逻辑(调用链)和错误处理分离了。和异常一样,我们可以简单读一下函数调用链来了解代码逻辑,而不用关心执行是在哪里被中断的。事实上,函数调用链可以在任何调用时被中断。但是我们可以认为没有错误发生,如果我们的逻辑是正确的,可以很快速检查。

当然,类型推导会阻止你在调用display之后继续进行绑定。所以我们也没有失去类型能力。

注意,我们没有在其他地方调用这些函数,我们在***将这些方法组装在一起。这里是关键,你应该编写一些小的模块函数(另外,注意:你应该编写模板函 数使其工作)接收一个值,然后计算一个新值或者返回失败。在每一步中,你都不需要考虑可能出现错误导致你的控制流中断,并且校验你是否在一个有效的状态上 (异常安全基于查询每个函数调用,指出函数是否中断你的控制流程,如果出现异常会发生什么),基于这一点,这样做更安全。

和异常一样,我们可以处理很详细的信息,尽管这里我们编写的是一个偏模板函数,所以也容易理解一些。

我们可以很容易放置异常处理逻辑,把它放在函数调用链之后(除非这个返回值还需要进一步被链接)。现在,我们有一个大的的执行流,没有中断,使用小 的函数处理流程,容易定位。当需要添加一个新的错误时,你只需找到那些函数,通过函数调用链,你可以直接定位到处理位置,并根据需要添加。大型项目变得更 加的线性化,并且更易读。

这样做有什么不足?

首先,这是一个新的处理方式,并且和C++的方式不兼容。这不是一个标准处理方法,当你使用stl时,你仍然需要使用异常。

对于我来说,这样做还是有点冗长。需要显式编写fail<int>(&hellip;)的模板推导显得有点怪异,如果你有个多态错误类型就更糟了,你不得不这样写fail<return_type, error_type>("...").

当函数有多个参数时编写也很困难,在其他一些语言中,可以使用适用类型和抽象类型很好地解决这个问题,不过这在C++中不会提供。我想更适合使用bind2(E<a>, E<b>, f)bind3(E<a>, E<b>, E<c>, f),可变模板参数功能更有用。

为获取封装错误中的值,我们需要检查这个值是否是有效值,接着调用一个“to_value”方法。我们没办法不通过检查来做到这一点。我们希望的是“解构”一个对象,不过这在C++中不支持,这也不是一些可以说“我们把它加入到下一个标准”的特性。

目前为止,我不知道读者是否有方法将其适配到成员函数中,如果你有想法,请测试一下,如果可以,请告知我们。

实现原子错误处理

我实现了它,我定义了这个黑魔法的名字&mdash;&mdash;“原子化”,你可以认为“原子化”是一个对值和错误上下文的装箱,比如,一个box包含一个值或者什么也不包含是一个原子组(这里作为一个练习,你可以试着实现一下)。

有点奇怪的是,从某个角度来说队列是一个原子组,他们拥有一个上下文的值。

让我们从上面的E模版类实现开始,这里使用了C++11标准中的decltype和auto -> decltype类型,允许自动推导得到表达式的类型,这非常有用。

这里的bind函数有点怪异,但是他实现了我刚才提到的内容。

关于C++的另一种错误处理策略是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网其他教程频道了解更多相关知识。

--结束END--

本文标题: C++的另一种错误处理策略是什么

本文链接: https://lsjlt.com/news/287881.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++的另一种错误处理策略是什么
    C++的另一种错误处理策略是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。这篇短文是讨论一个大多数程序员都感兴趣的一个话题:错误处理。错误处理是编程的一个“黑暗面”。它...
    99+
    2023-06-17
  • Golang函数的错误处理策略
    go 语言提供了以下错误处理机制:直接处理错误:在函数体中检查 err 变量。使用 defer:在函数退出时执行代码,无论函数是否返回正常或错误,用于清理资源或打印错误消息。使用 rec...
    99+
    2024-04-15
    golang 错误处理 mysql
  • Python中的异常处理的最佳实践和错误处理策略是什么?
    Python中的异常处理的最佳实践和错误处理策略是什么?异常处理是一种重要的编程技巧,可以帮助我们优雅地处理程序中的错误。在Python中,异常是指在程序执行过程中出现的错误、意外或异常情况。当出现异常时,Python会抛出一个异常对象,我...
    99+
    2023-10-22
    最佳实践 异常处理 错误处理策略
  • C#开发中如何处理异常链和错误处理策略
    C#开发中如何处理异常链和错误处理策略,需要具体代码示例在C#开发中,异常处理是非常重要的一环。当我们的程序遭遇异常时,如果没有正确处理,可能导致程序崩溃或产生意想不到的结果。为了应对这种情况,我们需要学习如何处理异常链和制定有效的错误处理...
    99+
    2023-10-22
    策略 错误处理 异常链
  • Golang 函数测试中的错误处理策略
    go 函数测试中的错误处理策略包括:使用内置 errors 包创建和管理错误。自定义错误类型以提供更具体的错误信息。使用 assert 断言简洁地检查错误条件。使用 fatal 和 sk...
    99+
    2024-04-16
    单元测试 错误处理 golang 标准库
  • C#开发建议:错误处理与故障恢复策略
    C#开发建议:错误处理与故障恢复策略在C#开发过程中,正确处理错误和制定有效的故障恢复策略是保证程序健壮性和稳定性的重要方面。尽管我们努力编写高质量的代码,但错误和故障难以避免。因此,本文将介绍几个关于错误处理和故障恢复策略的建议,帮助开发...
    99+
    2023-11-22
    故障恢复 开发建议 C#: 错误处理
  • Go 函数单元测试的错误处理策略
    在 go 函数单元测试中,错误处理有两种主要策略:1. 将错误表示为 error 类型的具体值,用于断言预期值;2. 使用通道向测试函数传递错误,适用于测试并发代码。实战案例中,使用错误...
    99+
    2024-05-02
    单元测试 错误处理
  • Golang函数指针和闭包的错误处理策略
    回答:在 go 中使用函数指针和闭包时,妥善处理错误至关重要,以避免程序崩溃。详情:函数指针:在使用函数指针调用函数时,必须检查底层函数的错误。闭包:在使用闭包时,必须在闭包函数中检查错...
    99+
    2024-04-17
    闭包 函数指针 golang
  • Elasticsearch常见的5个错误及解决策略是什么
    这期内容当中小编将会给大家带来有关Elasticsearch常见的5个错误及解决策略是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、采用动态Mapping如果不定义Mapping,Elastics...
    99+
    2023-06-04
  • RabbitMQ,RocketMQ,Kafka事务性的处理策略是什么
    这篇文章主要讲解了“RabbitMQ,RocketMQ,Kafka事务性的处理策略是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“RabbitMQ,RocketMQ,Kafka事务性的处...
    99+
    2023-06-29
  • win7组策略错误的原因及解决方法是什么
    Win7组策略错误可能有以下几个原因: 其他设置冲突:如果存在多个组策略设置,可能会导致冲突,从而引发错误。 缺少或损坏的文...
    99+
    2023-10-22
    win7
  • Go并发编程中的错误处理与恢复策略
    并发编程中错误处理有两种方法:主动错误处理(传播错误)和被动错误处理(错误管道)。恢复策略有两种:恢复(捕获恐慌)和重试(多次执行)。实战案例展示了这四种方法的使用。 Go并发编程中的...
    99+
    2024-05-11
    错误处理 恢复策略
  • C#开发中如何处理异常链和错误处理策略及解决方法
    C#开发中如何处理异常链和错误处理策略及解决方法在C#开发中,异常处理是一项重要的工作,它可以帮助我们排查程序中的错误,并且提高程序的稳定性和健壮性。异常链是一种常见的异常处理方式,它能够捕获和处理多个异常,以及提供更详细的错误信息。本文将...
    99+
    2023-10-22
    错误处理 解决方法 异常链
  • JVM调优的几种策略分别是什么
    这期内容当中小编将会给大家带来有关JVM调优的几种策略分别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。JVM参数调优是一个很头痛的问题,可能和应用有关系,别人说可以的对自己不一定管用。下面是本人一...
    99+
    2023-06-17
  • Git分支管理的策略是什么
    这篇“Git分支管理的策略是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Git分支管理的策略是什么”文章吧。一、创建测...
    99+
    2023-06-29
  • 管理SQL拼接的策略是什么
    管理SQL拼接的策略包括以下几个方面: 使用参数化查询:尽量避免直接拼接SQL语句,而是使用参数化查询,将参数传递给数据库引擎,...
    99+
    2024-04-29
    SQL
  • C++ 函数错误处理的最佳实践是什么?
    最佳 c++++ 函数错误处理方法:使用异常处理错误信息;使用错误码表示库/系统级别错误;使用断言验证假设;使用异常规范指定可抛出异常类型;使用自定义错误类创建自定义错误信息和跟踪来源。...
    99+
    2024-04-23
    c++ 函数错误
  • 送sessionStorage的另一种最佳选择是什么?
    替代sessionStorage的最佳选择是什么? 在Web开发中,我们经常需要将数据在前端进行存储和传递。而在过去,我们通常使用sessionStorage来处理这个任务。然而,随着前端技术的发展和需求的变化,sessionS...
    99+
    2024-01-15
    cookie
  • C++ 函数中错误处理的替代方案是什么?
    错误处理的替代方案:异常机制:使用 try-catch 块处理异常,优点是易读性强,缺点是可能导致异常传递;错误码:使用特定值表示错误,优点是控制细致,缺点是需要在调用者中检查错误码。 ...
    99+
    2024-04-23
    c++ 错误处理
  • Node.js的错误处理机制是什么
    本篇内容介绍了“Node.js的错误处理机制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Node.js 是一个基于 Chrome V...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作