关于 try... catch
在逛论坛看见一个有意思的帖子,有点意思,记录下
一些我觉得有用的回复,放到下面了,
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语句也无法被正常捕获,通常会导致程序终止、崩溃或无法继续执行。这些无法捕获的异常通常是由于某些特定的情况触发,例如硬件故障、操作系统限制、编程错误等。下面是一些可能会导致无法捕获异常的情况:
访问越界: 如果在数组访问中发生越界,例如访问一个不存在的数组元素,会导致无法捕获的异常。这可能触发操作系统的保护机制,导致程序被终止。
空指针引用: 当使用空指针(nullptr)访问对象的成员或者调用成员函数时,会触发空指针异常,这也是一种无法捕获的异常。
栈溢出: 当递归深度过大或者函数调用层级过多时,可能导致栈溢出异常,这通常会导致程序崩溃。
硬件故障: 例如除以零、硬件错误、非法指令等,这些异常可能会导致程序无法继续执行。
使用
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的更多相关文章
- SQLServer如何添加try catch
在.net中我们经常用到try catch.不过在sqlserver中我们也可以使用try catch捕捉错误,在这里把语法记录下来和大家分享一下, --构建存储过程CREATE PROCEDURE ...
- try...catch..finally
try..catch..finally try{ 代码块1 }catch(Exception e){ 代码块2 }finally{ 代码块3 } catch是抓取代码块1中的异常 代码块2是出异常后的 ...
- C++异常处理:try,catch,throw,finally的用法
写在前面 所谓异常处理,即让一个程序运行时遇到自己无法处理的错误时抛出一个异常,希望调用者可以发现处理问题. 异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制. 也许我们已经使 ...
- POJ 3278 Catch That Cow(bfs)
传送门 Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 80273 Accepted: 25 ...
- [c#基础]关于try...catch最常见的笔试题
引言 在翻看之前总结的常见面试题中,关于try...catch异常处理的还是蛮多了,今天看到这个面试题,也就重新学习一下. try..catch语法 try-catch语句由一个try块后跟一个或多个 ...
- 高程(4):执行环境、作用域、上下文执行过程、垃圾收集、try...catch...
高程三 4.2.4.3 一.执行环境 1.全局执行环境是最外层的执行环境. 2.每个函数都有自己的执行环境,执行函数时,函数环境就会被推入一个当前环境栈中,执行完毕,栈将其环境弹出,把控制器返回给之前 ...
- try catch里面try catch嵌套
try catch里能否内嵌try catch?答案是肯定的.但是等内层try catch出异常之后是个什么执行顺序呢?看下面代码 static void Main(string[] args) { ...
- 基础知识《十》java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
本文转载自 java 异常捕捉 ( try catch finally ) 你真的掌握了吗? 前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理 ...
- java try(){}catch(){}自动资源释放
从 Java 7 build 105 版本开始,Java 7 的编译器和运行环境支持新的 try-with-resources 语句,称为 ARM 块(Automatic Resource Manag ...
- Java throws Exception、try、catch
throws Exception是方法后面接的 意思是向上级抛出异常 try{}里面的异常会被外面的catch捕捉到 抛出异常是throw new Exception("异常"); ...
随机推荐
- [转帖]MySQL数据类型(decimal的存储大小)
本来还以为MySQL的数据类型挺简单的,没想到竟然有很多坑,容我仔细道来 MySQL数据类型 整数类型(注意是字节) 浮点型(重点关注decimal) 字符型(注意这是4.x版本的定义,5.x以后已经 ...
- [转帖]etcd raft模块解析
https://www.cnblogs.com/luohaixian/p/16641100.html 1. Raft简介 raft是一个管理复制式日志的共识算法,它是通过复制日志的方式来保持状态机里的 ...
- [转帖]JAVA⽣态的微服务⽆侵⼊链路追踪
https://v5.6-docs.rainbond.com/docs/v5.3/advanced-scenarios/devops/pinpoint/#pinpoint%E7%AE%80%E4%BB ...
- [转帖]Zen4架构+5nm制程+96核心 第四代AMD EPYC处理器强势来袭
https://new.qq.com/rain/a/20221111A098QE00 不得不承认,技术的持续突破和迭代,使得AMD处理器在近年来得到了"喷气机式"的增长,无论是 ...
- CentOS8 的容器运行时解决中文乱码问题的一个思路
首先说明一下 CentOS7和CentOS8关于locale语言文件的位置是不一样的. Docker pull centos 拉取下来的镜像 一般是不带中文语言包的. 简单方法是在 CentOS之后安 ...
- Gin 框架之jwt 介绍与基本使用
目录 一.JWT 介绍 二.JWT认证与session认证的区别 2.1 基于session认证流程图 2.2 基于jwt认证流程图 三. JWT 的构成 3.1 header : 头部 3.2 pa ...
- 控制node版本
https://blog.csdn.net/qq_46372463/article/details/125357226 这个作者写的操作成功了
- C++ STL 标准模板库(排序/集合/适配器)算法
C++ 标准模板库STL,是一个使用模板技术实现的通用程序库,该库由容器container,算法algorithm,迭代器iterator,容器和算法之间通过迭代器进行无缝连接,其中所包含的数据结构都 ...
- 记一次在服务器上运行node.js程序时无法通过nohup xxx & 方式挂起的问题
由于业务需求 每天要在服务器上整理一组数据,为了方便就用node.js来写了.但是运行的时候发现了一个问题 明明使用了nohup main.js &的方式后台运行了程序 但是一旦我关闭了she ...
- AIX6.1修改时区/修改时间
环境 AIX6.1 修改时间 格式:date -n mmddHHMMYY #mm表示月分,dd表示日期,HH表示小时,MM表示分钟,YY表示年份. 例子:date -n 1204171622 #修 ...