Tùy thuộc vào cách bạn đã sắp xếp thứ bậc ngoại trừ của bạn, lại ném một ngoại lệ bằng cách đặt tên biến ngoại lệ trong báo cáo kết quả ném có thể lát đối tượng ngoại lệ ban đầu.
Một biểu ném không tham số sẽ ném các đối tượng ngoại lệ hiện tại giữ gìn loại năng động của nó, trong khi một biểu ném với một cuộc tranh cãi sẽ ném một ngoại lệ mới dựa trên tĩnh loại lập luận để throw
.
Ví dụ:
int main()
{
try
{
try
{
throw Derived();
}
catch (Base& b)
{
std::cout << "Caught a reference to base\n";
b.print(std::cout);
throw b;
}
}
catch (Base& b)
{
std::cout << "Caught a reference to base\n";
b.print(std::cout);
}
return 0;
}
Theo văn bản trên, chương trình sẽ ra:
Caught a reference to base
Derived
Caught a reference to base
Base
Nếu throw b
là thay thế với một throw
, sau đó đánh bắt ngoài cũng sẽ bắt đầu ném Derived
ngoại lệ. Điều này vẫn giữ nếu lớp bên trong bắt giữ ngoại lệ Base
thay vì tham chiếu - mặc dù điều này có nghĩa là đối tượng ngoại lệ ban đầu không thể sửa đổi được, vì vậy bất kỳ thay đổi nào đối với b
sẽ không được phản ánh trong ngoại lệ Derived
. .
Nguồn
2009-09-26 18:01:33
Ah, tôi hoàn toàn quên mất việc cắt! Chết tiệt, điều đó quan trọng! Cảm ơn đã đưa ra vấn đề này. +1 (Mặc dù tôi nghĩ khi bạn viết "... giữ nguyên kiểu tĩnh ban đầu ..." nghĩa là _dynamic_ type. Kiểu gọi là _dynamic type_, sau khi tất cả, nếu không phải là _ "kiểu tĩnh ban đầu" _.) - – sbi
Tuyệt vời tôi cũng hoàn toàn quên mất điều đó. – GManNickG
Tôi rất vui vì ai đó đã gặp phải sự cố _slicing_;) –