你(真的)编写异常安全代码吗? [关闭]

本文翻译自:Do you (really) write exception safe code? [closed]

Exception handling (EH) seems to be the current standard, and by searching the web, I can not find any novel ideas or methods that try to improve or replace it (well, some variations exist, but nothing novel). 异常处理(EH)似乎是当前的标准,并且通过搜索网络,我找不到任何试图改进或替换它的新颖想法或方法(好吧,存在一些变化,但没有新颖的)。

Though most people seem to ignore it or just accept it, EH has some huge drawbacks: exceptions are invisible to the code and it creates many, many possible exit points. 虽然大多数人似乎忽略它或只是接受它,但EH 一些巨大的缺点:代码看不到异常,它会创建许多可能的退出点。 Joel on software wrote an article about it . 乔尔在软件上写了一篇关于它的文章 。 The comparison to goto fits perfect, it made me think again about EH. goto的比较非常完美,它让我再次想到了EH。

I try to avoid EH and just use return values, callbacks or whatever fits the purpose. 我尽量避免使用EH,只使用返回值,回调或任何适合目的的东西。 But when you have to write reliable code, you just can't ignore EH these days : It starts with the new , which may throw an exception, instead of just returning 0 (like in the old days). 但是当你必须编写可靠的代码时,你现在就不能忽视EH :它从new开始,它可能抛出一个异常,而不是只返回0(就像过去一样)。 This makes about any line of C++ code vulnerable to an exception. 这使得任何C ++代码行都容易受到异常的影响。 And then more places in the C++ foundational code throw exceptions... std lib does it, and so on. 然后C ++基础代码中的更多地方抛出异常...... std lib执行它,依此类推。

This feels like walking on shaky grounds .. So, now we are forced to take care about exceptions! 这感觉就像走在摇摇欲坠的地面上 。所以,现在我们被迫关注异常!

But its hard, its really hard. 但它很难,真的很难。 You have to learn to write exception safe code, and even if you have some experience with it, it will still be required to double check any single line of code to be safe! 你必须学会​​编写异常安全代码,即使你有一些经验,它仍然需要仔细检查任何一行代码是安全的! Or you start to put try/catch blocks everywhere, which clutters the code until it reaches a state of unreadability. 或者你开始在任何地方放置try / catch块,这会使代码混乱,直到它达到不可读状态。

EH replaced the old clean deterministical approach (return values..), which had just a few but understandable and easily solveable drawbacks with an approach that creates many possible exit points in your code, and if you start writing code that catches exceptions (what you are forced to do at some point), then it even creates a multitude of paths through your code (code in the catch blocks, think about a server program where you need logging facilities other than std::cerr ..). EH取代了旧的干净确定性方法(返回值..),它只有一些但可以理解且易于解决的缺点,一种方法可以在代码中创建许多可能的退出点,并且如果你开始编写捕获异常的代码(你是什么的)在某些时候被迫做某事),然后它甚至通过你的代码创建了许多路径(catch块中的代码,考虑一个服务器程序,你需要除了std :: cerr之外的日志工具..)。 EH has advantages, but that's not the point. EH有优势,但这不是重点。

My actual questions: 我的实际问题:

  • Do you really write exception safe code? 你真的写异常安全代码吗?
  • Are you sure your last "production ready" code is exception safe? 您确定最后一个“生产就绪”代码是异常安全的吗?
  • Can you even be sure, that it is? 你能确定吗,它是吗?
  • Do you know and/or actually use alternatives that work? 你知道和/或实际使用有效的替代品吗?

#1楼

参考:https://stackoom.com/question/7m71/你-真的-编写异常安全代码吗-关闭


#2楼

Some of us have been using exception for over 20 years. 我们中的一些人已经使用例外超过20年。 PL/I has them, for example. 例如,PL / I有它们。 The premise that they are a new and dangerous technology seems questionable to me. 它们是一种新的危险技术的前提似乎对我来说是个问题。


#3楼

  • Do you really write exception safe code? 你真的写异常安全代码吗?

Well, I certainly intend to. 好吧,我当然打算。

  • Are you sure your last "production ready" code is exception safe? 您确定最后一个“生产就绪”代码是异常安全的吗?

I'm sure that my 24/7 servers built using exceptions run 24/7 and don't leak memory. 我确信使用异常构建的24/7服务器可以全天候运行并且不会泄漏内存。

  • Can you even be sure, that it is? 你能确定吗,它是吗?

It's very difficult to be sure that any code is correct. 很难确定任何代码是否正确。 Typically, one can only go by results 通常,人们只能按结果去做

  • Do you know and/or actually use alternatives that work? 你知道和/或实际使用有效的替代品吗?

No. Using exceptions is cleaner and easier than any of the alternatives I've used over the last 30 years in programming. 没有。使用例外比我在编程过去30年中使用的任何替代方案更清晰,更容易。


#4楼

Leaving aside the confusion between SEH and C++ exceptions, you need to be aware that exceptions can be thrown at any time, and write your code with that in mind. 抛开SEH和C ++异常之间的混淆,您需要意识到可以随时抛出异常,并在编写代码时考虑到这一点。 The need for exception-safety is largely what drives the use of RAII, smart pointers, and other modern C++ techniques. 对异常安全的需求在很大程度上推动了RAII,智能指针和其他现代C ++技术的使用。

If you follow the well-established patterns, writing exception-safe code is not particularly hard, and in fact it's easier than writing code that handles error returns properly in all cases. 如果你遵循完善的模式,编写异常安全的代码并不是特别困难,事实上它比编写在所有情况下都能正确处理错误返回的代码更容易。


#5楼

I really like working with Eclipse and Java though (new to Java), because it throws errors in the editor if you are missing an EH handler. 我非常喜欢使用Eclipse和Java(Java新手),因为如果你缺少一个EH处理程序,它会在编辑器中抛出错误。 That makes things a LOT harder to forget to handle an exception... 这使得忘记处理异常变得更加困难......

Plus, with the IDE tools, it adds the try / catch block or another catch block automatically. 此外,使用IDE工具,它会自动添加try / catch块或其他catch块。


#6楼

Some of us prefer languages like Java which force us to declare all the exceptions thrown by methods, instead of making them invisible as in C++ and C#. 我们中的一些人更喜欢像Java这样的语言,它迫使我们声明方法抛出的所有异常,而不是像C ++和C#那样使它们不可见。

When done properly, exceptions are superior to error return codes, if for no other reason than you don't have to propagate failures up the call chain manually. 如果正确完成,异常优于错误返回代码,如果没有其他原因,您不必手动向上传播失败的调用链。

That being said, low-level API library programming should probably avoid exception handling, and stick to error return codes. 话虽这么说,低级API库编程应该可以避免异常处理,并坚持错误返回代码。

It's been my experience that it's difficult to write clean exception handling code in C++. 根据我的经验,用C ++编写干净的异常处理代码很困难。 I end up using new(nothrow) a lot. 我最终使用了new(nothrow)

热门文章

暂无图片
编程学习 ·

MapReduce详细分析

一、MapReduce概述 1、定义 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群 上。 2、MR进程 一个完整的MapR educe程序在分布式运行时有三类实例进程:**Mr AppMaster:**负责整个程序的过程调度及状态协调…
暂无图片
编程学习 ·

程序设计思想之模块

模块使用模块分割方法来进行系统构筑何为系统设计软件开发中的模块是什么功能与模块的关系软件系统的模块结构软件层驱动层硬件层连接模块的接口接口接口设计困难结束语 使用模块分割方法来进行系统构筑 何为系统设计 软件系统规模越大,制作起来就越困难。这和在建筑中建造狗窝…
暂无图片
编程学习 ·

Android开发第三方库的使用和集成

一、第三方SDK开发App开发APP开发是指的具体某个具体的项目,更倾向于用户体验、功能更偏于特定业务、讲究的是快速迭代、快速占领市场,通常会涉及到多个模块或者多个业务场景。SDK开发SDK 是为APP服务的,提供的大多是公共基础服务,如网络请求、打点统计、帐号服务等,在App…
暂无图片
编程学习 ·

小白爬虫--Xpath定位信息--举一反三

断断续续学了好多次爬虫,始终没抓到重点,最近两天终于摸到点门路,发现定位信息是最重要的,定位好了,再借助解析库就可以提取想要的信息了。 基本套路如下:(爬虫三部曲) 第一,抓取网页源代码 url = “你爬取信息的网址” headers = 请求头 import requests r0 = reques…
暂无图片
编程学习 ·

设计模式学习——单例模式

一、单例模式的概念1.1 概念单例模式是指 确保一个类在任何情况下都绝对只有一个实例,并提供一个全局访问点。单例模式的特点是隐藏其所有的构造方法。属于创建型模式。1.2 单例模式的适用场景确保任何情况下都绝对只有一个实例。例如ServletContext、ServletConfig、Applicat…
暂无图片
编程学习 ·

寻找凸包(Graham扫描法)

寻找凸包(Graham扫描法)题意描述对任意给定的平面上的点集,求最小凸多边形使得点集中的点要么在凸多边形的边上,要么在凸多边形的内部。Graham算法描述 1、在所有的点中找到一点p0,使得p0的纵坐标值最小,在有多个最小纵坐标的情况下,找横坐标最小的那一个。 2、将所有的…
暂无图片
编程学习 ·

Centos7中iptables防火墙的设置

防火墙的种类:包过滤防火墙 代理防火墙 状态检测技术通信原理: 一台客户端>iptables>服务器 数据包---》iptables把数据包分类进行处理(各种表rew,mangle,nat,filter表等)-- -》 filter:允许,不允许通过数据包。 nat:进行数据转换的数据包。 mangle:对数据包做…
暂无图片
编程学习 ·

创新实践记录一

使用UGUI制作开始界面 一、UGUI概述 1.1常用组件 UGUI是从Unity4.6开始被集成到Unity编译器中的官方UI系统,具有灵活,快速和可视化兼容性好的特点。以下为常用的UGUI控件:1.2创建UGUI控件 创建UI控件时,如果没有Canvas和EventSystem系统会自动创建。Canvas画布,是所有UI控…
暂无图片
编程学习 ·

查找 -- 7.1 Sear for a Range -- 图解

/********************************************************************************************************** 描述 Given a sorted array of integers, find the starting and ending position of a given target value. Your algorithm’s runtime complexity must be i…
暂无图片
编程学习 ·

free_spirit(在栈上爆破一个可以被free的fake_chunk)

free_spirit(在栈上爆破一个可以被free的fake_chunk)首先检查一下程序的保护机制然后,我们用IDA分析一下,功能3存在8字节溢出,将会把v7下面的buf指针覆盖掉,而覆盖了buf指针,就能实现任意地址写。那么,我们劫持函数栈返回地址为one_gadget即可,为了绕过结尾对buf的检查…
暂无图片
编程学习 ·

数据库导出到excel解决科学计数法问题

用Navicat等工具导出数据到excel的时候,身份证等超过11位的数字会自动转换成科学计数法,末尾数字变成“0000”。如何解决?解决方式:给超过11位的数字末尾添加 \t查询的时候,给相关字段添加 \tSELECT name,CONCAT(idcard,\t) from lm_reg然后再将查询结果导出到excel。如…
暂无图片
编程学习 ·

Django开发

一.创建django项目二.新建应用 1. 建立应用python manage.py startapp 应用名2. 在[setting]->[INSTALLED_APPS]建立应用三. 建立数据库 1. 编写文章数据模型类2. 建立迁移文件 python manage.py makemigrations3. 生成数据库 python manage.py migrate四.建立超级管理员 p…
暂无图片
编程学习 ·

Flink sql-client操作

版本信息 flink1.10 从官网下载kafka-connector支持的包和json的包 https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/table/connect.html在client中注册用于输出的表或者在ymal文件中注册表 CREATE TABLE sink-hehe ( id STRING, name STRING, age INT, hom…
暂无图片
编程学习 ·

Redis之父的“退役”感言

Redis之父Antirez今早发布了一篇文章,题为《The end of the Redis adventure》。多年以前深入学习过Redis,这个最流行的缓存解决方案。当时惊叹于其近乎“变态”的性能表现,简直就是一个性能猛兽。而更令人印象深刻的是,在优异的外在表现背后,其代码质量也同样优秀。当年又…
暂无图片
编程学习 ·

【java基础(五十)】为什么要使用泛型程序设计

从Java程序设计语言1.0版发布以来,变化最大的部分就是泛型。致使Java SE 5.0中增加泛型机制的主要原因是为了满足1999年制定的最早的Java规范需求之一(JSR 14)。专家组花费了5年左右的时间用来定义规范和测试实现。 泛型正是我们需要的程序设计手段。使用泛型机制编写的程序…
暂无图片
编程学习 ·

LeetCode高频面试题记录

LeetCode高频面试题记录 K 个一组翻转链表 困难 class Solution { public:ListNode* reverseKGroup(ListNode* head, int k) {if (head == NULL) return NULL;ListNode *a = head;ListNode *b = head;for (int i = 0; i < k; i++) {//判断是否满足一组kif (b == NULL) retur…