考虑以下代码段
try {
goesWrong();
}
catch (const std::bad_alloc &e)
{
std::cout << "Catching bad_alloc: " << e.what() << std::endl;
}
catch (const std::exception &e)
{
std::cout << "Catching exception: " << e.what() << std::endl;
}
为什么我们需要捕获很多单独的异常。最后的std::exception
就足以捕获所有异常,不是吗?为什么在std::bad_alloc
仍要捕获std::exception
时,要多花4行代码来明确捕获<script>
$("#button_click").click(function () {
var username = $(this).val();
$.ajax({
url: url,
method: "POST",
data: {
'username': username// data you want to send from front end to backend
},
dataType: 'json',
success: function (data) {
}
}
});
});
?
答案 0 :(得分:3)
为什么我们需要捕获很多单独的异常。
通常,因为根据所捕获的异常的类型,这允许不同的行为。
在这种情况下,有必要这样做,因为这种可能性没有得到利用。
例如,考虑在内存中分配了大缓存的情况。在这种情况下,捕获std::bad_alloc
时,您可能会释放缓存并重试,而在其他异常情况下该方法将无用。
答案 1 :(得分:2)
exception
可以是任何欺骗,而bad_alloc
则更具体。您不仅可能会对不同种类的异常做出不同的反应,而且还更清楚地表达了所发生的情况。编写完所有代码以表达您的意图后,不仅仅是使它以某种方式起作用。
答案 2 :(得分:2)
单独的catch语句使您根据抛出的异常类型具有不同的行为。
例如,您可能期望bad_alloc
并可以通过使用较小的分配再次尝试或释放其他位置的内存来从中恢复。
最后的std :: exception足以捕获所有异常,不是吗?
否,捕获std::exception
足以捕获所有从std::exception
派生的引发异常。在c ++ std::exception
中没有任何特殊含义,您可以将任何类型作为异常抛出。建议从std::exception
派生,但不是必需的。
甚至存在陷阱,例如您具有多个继承并且您的异常类源自std::exception
twice it won't be caught。
要捕获所有异常,您需要捕获...
:
struct my_exception {};
try
{
switch ( i )
{
case 1:
throw std::runtime_error( "i is 1" );
case 2:
// bad idea, who is responsible for freeing the exception? But perfectly legal
throw new std::runtime_error( "i is 1" );
case 3:
// you can throw numbers too
throw i;
case 4:
throw my_exception();
}
}
catch ( const std::exception& )
{
}
catch ( const my_exception& )
{
}
catch ( ... )
{
}
答案 3 :(得分:1)
到目前为止,除了给出的答案之外,还有其他答案:
实际上,您可以以对what()
字符串的求值为基础进行异常处理:
catch(std::exception const& e)
{
if(strcmp(e.what(), "some text"))
{
doThis();
}
else if(strstr(e.what(), "something"))
{
doThat();
}
// ...
}
但是,这要求您知道确切的字符串内容。如果这些在不同的C ++实现中有所不同,该怎么办?如果将它们本地化在某些系统上怎么办?您真的要应对所有这些问题吗?此外,文本处理比仅捕获不同的异常要昂贵得多。
因此,在不同的例外情况下,您将获得可移植性,安全性(考虑要与之比较的字符串中的错别字...),更容易且更好的可读性代码,以及效率。