在逛论坛看见一个有意思的帖子,有点意思,记录下

一些我觉得有用的回复,放到下面了,

1. 当某些错误状况难以完全避免时,try-catch 可以用来控制错误扩散范围,防止整个程序崩溃。比如外部系统异常、网络中断等不可控因素。

2. 对于业务逻辑复杂的情况,想要全面预测并避免所有错误是很困难的。try-catch 可以用来处理意料之外的异常状况。

3. try-catch 允许将错误处理与业务逻辑代码解耦,使主要逻辑更简洁清晰。合理使用也可以使程序结构更灵活。

4. 对于一些开发者不可修改的第三方代码,try-catch 可能是处理潜在错误的最佳手段。

所以,try-catch 更多是作为最后的“安全网”,并不是用来代替前置的输入校验和状态检测。合理的方法是状态检测与 try-catch 共同使用,使程序既健壮又能优雅地处理边界情况。总之,try-catch 并不是万金油,还需要开发者理性判断其适用场景。

当然,我们最好可以看看标准委员会成员对此问题的回答,

原文:

What good can using exceptions do for me? The basic answer is: Using exceptions for error handling makes your code simpler, cleaner, and less likely to miss errors. But what’s wrong with “good old errno and if-statements”? The basic answer is: Using those, your error handling and your normal code are closely intertwined. That way, your code gets messy and it becomes hard to ensure that you have dealt with all errors (think “spaghetti code” or a “rat’s nest of tests”).

机翻:

使用异常来进行错误处理有哪些好处呢?基本的回答是:使用异常来进行错误处理可以使你的代码更简洁、更清晰,且不太容易漏掉错误。但是,使用“老式的 errno 和 if 语句”有什么问题呢?基本的回答是:使用这种方式,你的错误处理代码和普通代码会紧密交织在一起。这样会让你的代码变得混乱,很难确保你已经处理了所有的错误(类似“代码逻辑混乱”或“错综复杂的测试条件”)


拓展:

try... catch 能捕获哪些异常以及无法捕获哪些异常呢?

"无法捕获的异常"指的是在C++的异常处理机制中,某些异常在被抛出时,即使使用try-catch语句也无法被正常捕获,通常会导致程序终止、崩溃或无法继续执行。这些无法捕获的异常通常是由于某些特定的情况触发,例如硬件故障、操作系统限制、编程错误等。下面是一些可能会导致无法捕获异常的情况:

  1. 访问越界: 如果在数组访问中发生越界,例如访问一个不存在的数组元素,会导致无法捕获的异常。这可能触发操作系统的保护机制,导致程序被终止。

  2. 空指针引用: 当使用空指针(nullptr)访问对象的成员或者调用成员函数时,会触发空指针异常,这也是一种无法捕获的异常。

  3. 栈溢出: 当递归深度过大或者函数调用层级过多时,可能导致栈溢出异常,这通常会导致程序崩溃。

  4. 硬件故障: 例如除以零、硬件错误、非法指令等,这些异常可能会导致程序无法继续执行。

  5. 使用 abort 函数: 如果在程序中调用了abort函数,它会立即终止程序运行,不会触发C++异常处理机制。

"可以捕获的异常"指的是在C++的异常处理机制中,一些异常可以通过try-catch语句被捕获并进行处理,从而避免程序的终止或崩溃。这些异常通常是由于特定情况的错误或异常情况而抛出的,例如在函数中使用throw语句抛出的异常,或者由标准库中的异常类抛出的异常。

以下是一些常见可以捕获的异常的示例以及如何使用 try-catch来捕获和处理它们:

1. 自定义异常: 开发者可以自定义异常类,通常继承自 std::exception 或其子类,然后在需要的地方使用 throw 语句抛出这些自定义异常。

#include <iostream>
#include <stdexcept> class MyException : public std::exception {
public:
const char* what() const noexcept override {
return "My custom exception";
}
}; int main() {
try {
throw MyException();
} catch (const std::exception& e) {
std::cout << "Caught exception: " << e.what() << std::endl;
}
return 0;
}

2. 标准库异常: C++标准库提供了一些异常类,例如std::runtime_error、std::logic_error等,可以在需要时抛出,然后通过try-catch捕获和处理。

#include <iostream>
#include <stdexcept> int main() {
try {
throw std::runtime_error("Standard exception");
} catch (const std::exception& e) {
std::cout << "Caught exception: " << e.what() << std::endl;
}
return 0;
}

3. 函数可能抛出的异常: C++中的函数可以在其声明中指定可能抛出的异常类型,调用这些函数时,编译器会提示你可能需要捕获这些异常。

#include <iostream>
#include <stdexcept> void foo() {
throw std::runtime_error("Exception from foo()");
} int main() {
try {
foo();
} catch (const std::exception& e) {
std::cout << "Caught exception: " << e.what() << std::endl;
}
return 0;
}

  

注意,在捕获异常时,通常使用基类类型(如 const std::exception&)来捕获异常,这样可以捕获各种不同类型的异常,而不需要为每一种异常都编写特定的 catch 块。这种做法也符合异常处理的最佳实践。

关于 try... catch的更多相关文章

  1. SQLServer如何添加try catch

    在.net中我们经常用到try catch.不过在sqlserver中我们也可以使用try catch捕捉错误,在这里把语法记录下来和大家分享一下, --构建存储过程CREATE PROCEDURE ...

  2. try...catch..finally

    try..catch..finally try{ 代码块1 }catch(Exception e){ 代码块2 }finally{ 代码块3 } catch是抓取代码块1中的异常 代码块2是出异常后的 ...

  3. C++异常处理:try,catch,throw,finally的用法

    写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使 ...

  4. POJ 3278 Catch That Cow(bfs)

    传送门 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 80273   Accepted: 25 ...

  5. [c#基础]关于try...catch最常见的笔试题

    引言 在翻看之前总结的常见面试题中,关于try...catch异常处理的还是蛮多了,今天看到这个面试题,也就重新学习一下. try..catch语法 try-catch语句由一个try块后跟一个或多个 ...

  6. 高程(4):执行环境、作用域、上下文执行过程、垃圾收集、try...catch...

    高程三 4.2.4.3 一.执行环境 1.全局执行环境是最外层的执行环境. 2.每个函数都有自己的执行环境,执行函数时,函数环境就会被推入一个当前环境栈中,执行完毕,栈将其环境弹出,把控制器返回给之前 ...

  7. try catch里面try catch嵌套

    try catch里能否内嵌try catch?答案是肯定的.但是等内层try catch出异常之后是个什么执行顺序呢?看下面代码 static void Main(string[] args) { ...

  8. 基础知识《十》java 异常捕捉 ( try catch finally ) 你真的掌握了吗?

    本文转载自  java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...

  9. java try(){}catch(){}自动资源释放

    从 Java 7 build 105 版本开始,Java 7 的编译器和运行环境支持新的 try-with-resources 语句,称为 ARM 块(Automatic Resource Manag ...

  10. Java throws Exception、try、catch

    throws Exception是方法后面接的 意思是向上级抛出异常 try{}里面的异常会被外面的catch捕捉到 抛出异常是throw new Exception("异常"); ...

随机推荐

  1. [转帖]RHEL/CentOS 7的systemd target及其中的multi-user.target

    在RHEL/CentOS 6中,使用SysV init和Upstart,通过预定义一组Runlevels(从0到6)表示不同的执行模式. [root@myhost app]# ll /etc/rc.d ...

  2. [转帖]一、Kafka Tool使用

    一.Kafka Tool使用 1.添加cluster 2.开启SASL_PLAINTEXT 如果kafka 开启SASL_PLAINTEXT认证(用户名和密码认证) 3.高级设置 如果设置的是SASL ...

  3. [转帖]【P1】Jmeter 准备工作

    文章目录 一.Jmeter 介绍 1.1.Jmeter 有什么样功能 1.2.Jmeter 与 LoadRunner 比较 1.3.常用性能测试工具 1.4.性能测试工具如何选型 1.5.学习 Jme ...

  4. 【转帖】Linux 调优篇 :虚拟化调优(irqbalance 网卡中断绑定)* 贰

    一.网络流量上不去二.中断绑定2.1 关闭中断平衡守护进程2.2 脱离中断平衡守护进程2.3 手动设置中断的CPU亲和性三. 总结 一.网络流量上不去 在Linux的网络调优方面,如果你发现网络流量上 ...

  5. [转帖]linux下/proc/sysrq-trigger详解

    /proc/sysrq-trigger详解 这是一组"魔术组合键",只要内核没有被完全锁住,不管内核在做什么事情,使用这些组合键能即时打印出内核的信息. 使用SysRq组合键是了解 ...

  6. JVM启动参数脚本的再学习与研究

    JVM启动参数脚本的再学习与研究 摘要 学无止境 前段时间一直再研究JVM参数调优. 但是最近也在想不应该仅研究如何调优. 因为不管怎么设置, 总有猪队友会把环境搞崩. 所以应该想办法在无人值守的情况 ...

  7. 公司内部自建DNS的办法 使用私有域名的方法

    最近总是有一个需求,需要自己弄一些服务器域名之类的. 修改hosts总是比较麻烦,所以想了一个简单办法, 自己搭建一个dns服务器, 本来想用最简单的 dnsmasq 但是发现总是不成功, 然后找了另 ...

  8. 对于Vue3和Ts的心得和思考

    作者:京东物流 吴云阔 1 前言 Vue3已经正式发布了一段时间了,各种生态已经成熟.最近使用taro+vue3重构冷链的小程序,经过了一段时间的开发和使用,有了一些自己的思考. 总的来说,Vue3无 ...

  9. element-ui中Select 选择器去除点击时的淡蓝色边框

    <el-select class="my-el-select" v-model="tenantCont" placeholder="请输入机构标 ...

  10. 4款超好用的AI换脸软件,一键视频直播换脸(附下载链接)

    随着AIGC的火爆,AI换脸技术也被广泛应用于娱乐.广告.电影制作等领域,本期文章系统介绍了市面上超火的4款AI软件 换脸整合包收录了全部4款AI工具,请按照需要选择下载: 百度网盘:https:// ...