C++异常测试

C++异常测试,c++,visual-studio-2013,exception-handling,C++,Visual Studio 2013,Exception Handling,我想测试返回了什么异常。在所有关于异常处理的示例中,我看到它们只是打印一些消息,没有对异常类型进行真正的测试。所以我试了一下: string Out_of_range{ "stol argument out of range" }; long Long; try{ Long = stol( "12345678901234567890" ); } catch( exception& Ex ){ string What = Ex.what(); if( What =

我想测试返回了什么异常。在所有关于异常处理的示例中,我看到它们只是打印一些消息,没有对异常类型进行真正的测试。所以我试了一下:

string Out_of_range{ "stol argument out of range" };
long Long;
try{
    Long = stol( "12345678901234567890" );

} catch( exception& Ex ){
    string What = Ex.what();
    if( What == Out_of_range )
        cout << "OK 1\n";;
    if( Ex.what() == What )
        cout << "OK 2\n";;
    if( Ex.what() == Out_of_range )
        cout << "OK 3\n";;
    if( Ex.what() == "stol argument out of range" )
        cout << "OK 4\n";;
}
问题1:为什么第四个if语句是错误的

问题2:除了使用what成员之外,还有其他方法测试异常吗

问题1:为什么第四个if语句是错误的

在该行中,您比较的是两个char const*,而不是两个字符串

问题2:除了使用what成员之外,还有其他方法测试异常吗

std::stol可以引发以下异常:

std::如果无法执行转换,则参数无效 如果转换的值将超出结果类型的范围,或者如果基础函数std::strtol或std::strtoll将errno设置为ERANGE,则std::out_of_range。 您可以对这两种类型的异常使用显式catch块

try
{
   Long = stol( "12345678901234567890" );
}
catch( std::invalid_argument const& Ex )
{
   // Deal with the exception
}
catch( std::out_of_range const& Ex )
{
   // Deal with the exception
}
catch( exception const& Ex )
{
   // Deal with the exception
}
问题1:为什么第四个if语句是错误的

签名是

在您的案例中,字符串文字和指向同一内存地址的结果进行比较的可能性很小

问题2:除了使用what成员之外,还有其他方法测试异常吗

对。使用多个catch{}块,每个特殊异常类型一个。此外,还应通过常量引用捕获异常:

try{
    Long = stol( "12345678901234567890" );

} catch(const std::invalid_argument& Ex) {
    // Handle invalid_argument exception
} catch(const std::out_of_range& Ex) {
    // Handle out_of_range exception
} catch( ... )
    // Handle unexpected exception
} 

除了使用what成员,还有其他方法测试异常吗?对使用多个catch块,每个特殊异常类型对应一个catch块。还要注意std::exception::what is const char*what const;的签名;。字符串文字和指向同一内存地址的内容的结果不太可能。小细节:异常应该由常量引用或值捕获。我同意常量部分,但不同意值部分。如果你按值捕获,你就有可能把你的对象切片。是的,你对价值部分是正确的,这很容易发生。我来自Perl,不得不切换到C++,因为有一个繁重的计算程序的性能问题。所以我习惯了类型的简单性,字符串就是字符串,到处都是。在C++中,我不断地伤害自己,有字符串,字符串看起来完全相同,但完全不同。真是一团糟@JANLLULX C++通常强制使用STD::String,而不是CHAR *。什么是罕见的例外,没有双关语的意思。
virtual const char* what() const;
try{
    Long = stol( "12345678901234567890" );

} catch(const std::invalid_argument& Ex) {
    // Handle invalid_argument exception
} catch(const std::out_of_range& Ex) {
    // Handle out_of_range exception
} catch( ... )
    // Handle unexpected exception
}