xem xét mã này:ngoại lệ bắt cơ chế, C++
int main()
{
try
{
throw std::range_error("");
}
catch (std::bad_alloc)
{
std::cout << "AAAA" << std::endl;
throw;
}
catch (std::range_error)
{
std::cout << "BBB" << std::endl;
throw;
}
catch (std::exception)
{
std::cout << "CCC" << std::endl;
}
std::cout << "DDD" << std::endl;
}
Ở đây tôi ném một ngoại lệ kiểu std::range_error
và cố gắng nắm bắt nó.
Hợp lý khối catch
đầu tiên không thể bắt được do loại không phù hợp (std::bad_alloc
và std::range_error
).
Khối bắt thứ hai phải bắt được vì chúng là cùng loại std::range_error
.
Và cũng có thể, khi tôi tính lại ngoại lệ trong khối đánh bắt thứ hai, nó phải bị bắt trong khối đánh bắt thứ ba.
Vì vậy, đầu ra của tôi phải
BBB
CCC
DDD
Nhưng tôi chỉ nhận được những BBB
đầu ra với việc chấm dứt.
Ai đó có thể giải thích cho tôi về hành vi không?
ném thứ hai của bạn đã không xảy ra trong một 'khối try'. Vì vậy, nó không thể bị bắt. – Galik
Nó không hoạt động theo cách đó.Mỗi khối try-catch chỉ nhận được một phát ở ngoại lệ cho dù có bao nhiêu mệnh đề bắt được. Các ngoại lệ được ném bởi bất kỳ điều khoản bắt nào đều không bị bắt trong khối try-catch đó. – davidbak
điều đó có nghĩa là ngay cả khi tôi có nhiều khối catch của loại ngoại lệ, chỉ cái đầu tiên mới bắt được ngoại lệ, tôi có đúng không? –