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

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

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_errorstd::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. [转帖]kubernetes(k8s):容器资源限制(内存限制、cpu限制、namespace限制)

    文章目录 1. k8s容器资源限制 2. 内存资源限制实例 3. cpu资源限制 4. namespace设置资源限制 5. namespace中pod的配额 6. namespace的创建.使用和删 ...

  2. Linux部分参数的学习

    Linux部分参数的学习 简介 之前总结过很多Nginx或者是部署软件时的一些注意事项. 但是感觉对linux系统参数部分掌握的不是很好. 今天周末想着整理一下,作为备忘. limits.conf i ...

  3. 使用perfdog如何测试微信小程序

    测试微信小程序和测试其他app唯一的不同点是如何在app中选中要测试的小程序 至于其他的基本操作可查看https://www.cnblogs.com/lihongtaoya/p/15140610.ht ...

  4. 微信小程序-组件生命周期方法

    官方文档:https://developers.weixin.qq.com/miniprogram/dev/reference/api/Component.html 正如官方显示组件的生命周期中常用的 ...

  5. 给你一颗“定心丸”——记一次由线上事故引发的Log4j2日志异步打印优化分析

    一.内容提要 自知是人外有人,天外有天,相信对于Log4j2的异步日志打印早有老师或者同学已是熟稔于心,优化配置更是信手拈来,为了防止我在这里啰里八嗦的班门弄斧,我先将谜底在此公布:log4j2.as ...

  6. SqlSugar的Select用法

    Select 位置 正常情况:应该在最后面, 一般是 .Where(..).OrderBy(..).Select(..).ToList() 特殊情况:如果Select不是最后一个位置,则Select要 ...

  7. 多模态对比语言图像预训练CLIP:打破语言与视觉的界限

    多模态对比语言图像预训练CLIP:打破语言与视觉的界限 一种基于多模态(图像.文本)对比训练的神经网络.它可以在给定图像的情况下,使用自然语言来预测最相关的文本片段,而无需为特定任务进行优化.CLIP ...

  8. 【二】tensorflow调试报错、TF深度学习强化学习教学

    相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...

  9. SpringBoot实现统一异常处理

    目录 前言 实现步骤 定义统一响应对象类 定义业务异常枚举接口和实现 定义业务异常基类 定义全局异常处理切面 测试和验证 总结 前言 近日心血来潮想做一个开源项目,目标是做一款可以适配多端.功能完备的 ...

  10. clickhouse导入和导出

    一.连接clickhouse--客户端连接default库clickhouse-client -h localhost --port 9001 -u default --password 123456 ...