Khi bạn ném ngoại lệ, chức năng tạm dừng ở đó và thực thi nhảy đến bất cứ nơi nào ngoại lệ bị bắt. Hàm của bạn không trả về bất cứ điều gì vì hàm không trả về.
Bạn chỉ có thể làm
if (avec.empty())
throw domain_error("Cannot operate on empty vector!");
Và chức năng của bạn sẽ thoát khỏi đó. Lưu ý rằng bạn không cần phải quan tâm đến giá trị trả về ("Làm thế nào có thể một hàm không trả về bất kỳ thứ gì?") Vì bạn không thể truy cập giá trị trả về của hàm đã ném (và không bắt được).) một ngoại lệ ngay cả khi bạn thử.
Vì vậy, ví dụ, nếu bạn làm
try {
std::vector<myStruct> vec;
std::vector<myStruct> retval = extract_notworking(vec);
print_vector(retval); // this line is only executed if extract_networking
// does not throw an exception
} catch (const domain_error& e) {
// we can't access retval here so no worries
}
Bạn chỉ có thể truy cập vào retval
nếu hàm trả về đúng (ví dụ: không ném). Trong ví dụ này, hàm của bạn sẽ ném vì vec
trống, vì vậy print_vector
sẽ không bao giờ được gọi.
Thậm chí nếu bạn làm điều này:
std::vector<myStruct> retval;
try {
std::vector<myStruct> vec;
retval = extract_notworking(vec);
print_vector(retval);
} catch (const domain_error& e) {
// we can access retval here but the assignment never happened
}
Kể từ khi chức năng không trở về, sự phân công của giá trị trả về của nó để retval
đã không xảy ra, và retval
vẫn là một hoàn toàn bình thường mặc định-xây dựng vector
mà bạn có thể sử dụng tự do. Vì vậy, trong ví dụ đó, retval
không được gán cho và retval
không được in, bởi vì extract_networking
đã ném ngoại lệ và thực thi nhảy vào khối catch
trước khi hai điều đó có thể xảy ra.
Nguồn
2012-03-03 20:18:11
Nếu bạn ném một ngoại lệ, thì chức năng của bạn sẽ không trở lại. Đó là toàn bộ vấn đề. –
Vì vậy, có thể làm cho chức năng của tôi void và thêm một tham số bằng cách tham chiếu đến vector của tôi? – Mihaela
có thể trùng lặp của [Trả lại sau khi ném ngoại lệ] (http://stackoverflow.com/questions/3109943/returning-after-throwing-exceptions) –