我正在编写一个类来处理一个流,这个流可以在它读取的数据中发生某些致命错误时抛出多个异常(不是一次)。在该类的驱动程序中,我有一个try / catch块,我希望针对可能发生的特定异常异常执行不同的行为。
e.g:
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>
}
...
}
我考虑过:
Frame-based Exception Handling可能是合适的,但它仅限于Windows,我想让这段代码变得可移植,而我实际上并不清楚它的含义是什么,所以它甚至可能都不相关反正。
因为我正在处理流,所以如果发生这样的错误,我希望能够立即中断处理,所以我想在这里使用例外。有可能没有例外地做到这一点,但是现在的问题看起来很通用,在其他地方很有用,这就是我在这里问的原因。
这种情况有没有最佳做法?
答案 0 :(得分:3)
恕我直言,最好的方法是继承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");
...
因此,只需一行代码即可获得异常,并可轻松使用层次结构测试来解决特定异常。
答案 1 :(得分:1)
如果您希望处理多个异常,可以创建自己的异常子类化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并使代码更清晰,更易于阅读。