如何识别抛出的特定异常
How to identify a specific exception thrown
我正在编写一个类来处理一个流,它可以在读取数据中的某些致命错误时抛出多个异常(不是一次)。在该类的驱动程序中,我有一个try/catch块,我想在其中对可能发生的特定不同异常执行不同的行为。
例如:
try{
functionWhichPerformsStreamProcessing(); // may throw exception at some point
}
catch (std::exception &exceptionWhichMustBeHandledDifferently){
if ( <exception is some type> ){
<code to handle>
}
else if ( <exception is some other type> ){
<different code>
}
...
}
我认为:
- 检查异常的。what()字符串
- 似乎很难调试,如果字符串后来被更改
- 为每个异常子类化std::exception
- 当需要为每个不同的异常创建一个新的子类时,
- 似乎是多余的
- 一个带有某种形式的错误代码的异常,可能是一个字符串,即使解释性的。what()改变了,也不会改变
- 我可能会在一个单独的头中为这些标识符定义预处理器宏,以跟踪并确保不会改变 这让我想到了c风格的错误代码,尽管
基于框架的异常处理可能是合适的,但它仅限于Windows,我想使这段代码可移植,我实际上不知道它在说什么,所以它可能甚至不相关。
因为我正在处理一个流,如果发生这样的错误,我希望能够立即中断处理,所以我想在这里使用异常。可能有办法做到这一点,没有例外,但这个问题似乎是通用的,足以在其他地方有用,这就是我在这里问的原因。
对于这种情况有什么最佳实践吗?我认为最好的方法是子类化std::exception。我通常会编写子类,除了非常简单的异常,我想尽快解决。在这种情况下,我将使用宏..
但是要有有用的文本异常通常需要接受更多的上下文,关于什么出错了,这就是为什么最后大多数情况下它们是手写的。
下面是我曾经用过的一个例子:
#include <exception>
#define MAKE_EXCEPTION( v_class_name_, v_parent_name_, v_what_ )
class v_class_name_
: public v_parent_name_ {
public:
inline virtual const char* what() const noexcept
{ return v_what_;}
}
MAKE_EXCEPTION(ZipFileException, std::exception, "ZipFileException: General Failure in ZipFile Operation");
MAKE_EXCEPTION(ZipFileInvalidFileException, ZipFileException, "ZipFileInvalidFileException: File is not a zipfile. Or File is corrupt");
MAKE_EXCEPTION(ZipFileEncryptionNotSupportedException, ZipFileException, "ZipFileEncryptionNotSupportedException: Can't open encrypted zip files");
MAKE_EXCEPTION(ZipFileCompressionMethodNotSupportedException, ZipFileException, "ZipFileCompressionMethodNotSupportedException: Zip file contains a compression method that is not supported");
MAKE_EXCEPTION(ZipFileOpenException, ZipFileException, "ZipFileOpenException: Failed to open the zipfile");
MAKE_EXCEPTION(ZipFileMultiPartNotSupportedException, ZipFileException, "ZipFileMultiPartNotSupportedException: Can't open multipart zip files");
…
所以你可以得到一个异常,只需一行代码和使用层次结构测试特定的异常很容易。
如果希望处理多个异常,可以创建自己的异常子类std::exception,然后用多个catch块构建try-catch,如下所示:
try{
functionWhichPerformsStreamProcessing();
}
catch (yourExceptionType &differentExceptionWhichMustBeHandledDifferently){
//do stuff
}
catch (yourAnotherExceptionTYpe &yetAnotherExceptionWhichMustBeHandledDifferently){
//do some additional stuff
}
catch (std::exception &exceptionWhichMustBeHandledDifferently){
//do some different stuff
}
它使您可以跳过所有这些if-else,使代码更清晰,更易于阅读。
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- 提升 ASIO 无法识别计时器对象
- C++中的赋值发生,尽管右侧出现异常
- 从udp接收帧对于人脸识别来说太慢
- 模板类无法识别友元运算符
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- Python中的for循环与C++有何不同
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- std::visit无法识别类型
- catch语句如何在没有反射的情况下识别异常类型
- 识别终止中抛出的c++异常
- 如何识别抛出的特定异常
- c++中无法捕获异常:无法识别异常类型
- CUTE单元测试无法识别引发的异常