关于 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("异常"); ...
随机推荐
- 使用Grafana监控Nacos的简单过程
使用Grafana监控Nacos的简单过程 背景 与kafka一样,想同期监控一下nacos. 发现nacos跟minio等一样都有对应的 metrics的暴露接口. 所以这边简单使用一下. stud ...
- [转帖]Active Session History (ASH)
Introduction V$ACTIVE_SESSION_HISTORY DBA_HIST_ACTIVE_SESS_HISTORY Enterprise Manager Performance Pa ...
- [转帖]可直接拿来用的kafka+prometheus+grafana监控告警配置
kafka配置jmx_exporter 点击:https://github.com/prometheus/jmx_exporter,选择下面的jar包下载: 将下载好的这个agent jar包上传到k ...
- [转帖]Nginx 反向代理解决跨域问题
https://juejin.cn/post/6995374680114741279 编写代码两分钟,解决跨域两小时,我吐了. 如果对跨域还不了解的朋友,可以看这篇:[基础]HTTP.TCP/IP 协 ...
- [转帖]一次 Java 进程 OOM 的排查分析(glibc 篇)
https://juejin.cn/post/6854573220733911048 遇到了一个 glibc 导致的内存回收问题,查找原因和实验的的过程是比较有意思的,主要会涉及到下面这些: Linu ...
- [转帖]ChatGPT发展历程、原理、技术架构详解和产业未来 (收录于先进AI技术深度解读)
https://zhuanlan.zhihu.com/p/590655677 陈巍谈芯::本文将介绍ChatGPT的特点.功能.技术架构.局限.产业应用.投资机会和未来.作者本人曾担任华为系自然语言处 ...
- [转帖]nmon使用及监控数据分析
[使用] [监控数据分析] 参考链接:nmon监控数据分析 性能测试中,各个服务器资源占用统计分析是一个很重要的组成部分,通常我们使用nmon这个工具来进行监控以及监控结果输出. 一.在监控阶段使用类 ...
- vim 复制代码的方法
之前vim 复制代码 总是格式变错乱了 尤其是yaml文件 有的还带注释 非常痛苦 今天早上查了下 原来处理的方式非常简单 增加一个参数就可以了 方法为 1. vim 打开一个文件 2.输入 :se ...
- vue3.0中reactive的正确使用姿势
场景 在项目开发的时候,前端肯定是先写静态页面 在静态页面写好之后 然后就可以与后端对接数据了[高兴] 但是在对接接口的时候 我们会发现后端返回来的字段与前端在页面上写的可能不一致 这个时候有意思的事 ...
- 将input 中的小写字母转化为大写字母
小写转换为大写,使用toLocaleUpperCase() options.element.find(".CarNumber").textbox({ label: '车牌号:', ...