具有不同的异常类
Having different exception classes
本文关键字:异常 更新时间:2023-10-16
我有一个关于异常的简单问题。为什么人们经常对每种类型的异常使用单独的类,是因为我们可能希望以不同的方式处理不同的异常吗?(例如,与仅仅捕捉"…"相比)。
Exception对象不仅仅用于指示发生了什么,因此catch (...)
将是使用异常功能的一种非常原始的方式。
每个异常对象通常都会携带一个"有效负载":从异常发生的地方到处理异常的地方的信息。当异常飞上展开调用堆栈时,沿途的函数可能会拦截它,用额外的信息丰富它,并在向上发送它。程序中的不同功能模块将向异常处理程序发送完全不同的信息,这就是为什么您需要不同的异常类来携带这些信息。
例如,解析器异常可能携带有关行号和语法错误性质的信息。文件系统异常可能包含有关文件名和错误代码的信息。动态内存异常可能携带有关特定内存操作和内存块大小的信息。等等。要存储和携带那些完全不相关的数据集,通常需要定义不同的异常类型。
除了在特殊情况下提供不同的数据以及处理不同错误的不同方式外,您还可以决定在不同的位置处理它们。考虑一个函数loadFileContentIntoMemory
,它可能由于文件系统错误(访问权限、找不到文件等)和内存问题(通常为std::bad_alloc
)而引发错误。您可能希望处理一种错误,而另一种错误不能同时处理。例如,您可能想捕获与文件相关的错误,然后尝试另一个文件名,而通常很难在程序的任何位置对bad_alloc
采取任何措施,因此许多程序都会在非常高级的位置捕获它,以发出错误消息并终止程序。
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 函数如何通知用户它基于函数原型抛出异常?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- Pytorch torch.cholesky忽略异常