Xét đoạn mã sau sử dụng lớp ngoại lệ tăng của:.Tôi có thể sao chép-xây dựng một tăng :: ngoại lệ với các thông tin lỗi?
class exception : virtual public boost::exception {
// ...
};
template<typename Exc>
class exception_impl : virtual public std::exception
, public Exc {
public:
exception_impl(const Exc& exc) : Exc(exc) {}
virtual const char* what() const throw() {return "blah";}
};
(Trên thực tế mã này là phức tạp hơn Ví dụ, exception_impl
chỉ xuất phát từ std::exception
nếu sau này không phải là đã là một lớp cơ sở trực tiếp hoặc gián tiếp của Exc
. Nhưng điều này chỉ lãng từ vấn đề tôi có, vì vậy tôi đã bỏ qua nó)
vì điều này, bây giờ tôi có thể lấy được các lớp ngoại lệ của riêng tôi:.
class some_exception : public exception {
// ...
};
Và sử dụng chúng:
struct tag_test_int;
typedef boost::error_info<tag_test_int,int> test_int_info;
void f()
{
boost::throw_exception(exception_impl<some_exception>() << test_int_info(42));
}
Tuy nhiên, nó chỉ ra rằng ngoại trừ kết quả không có đối tượng test_int_info
. Vì vậy, tôi đã thay đổi các nhà xây dựng exception_impl
cung cấp một số thông tin chẩn đoán:
exception_impl(const Exc& exc)
: Exc(exc) {
std::cerr << "========================================================================\nexc:\n";
std::cerr << boost::diagnostic_information(exc);
std::cerr << "========================================================================\n*this:\n";
std::cerr << boost::diagnostic_information(*this);
std::cerr << "========================================================================\n";
}
này thực sự cho thấy rằng những thông tin bị mất khi tôi sao chép các đối tượng Exc
vào exception_impl
cơ sở lớp đối tượng:
======================================================================== exc: Throw location unknown (consider using BOOST_THROW_EXCEPTION) Dynamic exception type: some_exception [tag_test_int*] = 42 ======================================================================== *this: Throw location unknown (consider using BOOST_THROW_EXCEPTION) Dynamic exception type: exception_impl std::exception::what: "blah"
IIRC, các đối tượng ngoại lệ phải được sao chép theo tiêu chuẩn và, bỏ qua tối ưu hóa có thể có, kết quả của một biểu thức ném được sao chép. Vì vậy, ngoại lệ của boost phải được sao chép và chắc chắn họ không mất thông tin của họ trên đường đi. Tôi phải thiếu một cái gì đó khá rõ ràng ở đây.
Tôi đang làm gì sai?
có lẽ có liên quan http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2106.html và http://www.open-std.org/jtc1/sc22/wg21 /docs/papers/2007/n2179.html – sehe
OK, do đó, vì một số lý do không giải thích được (không thể giải thích cho tôi), vấn đề sẽ biến mất khi tôi lấy được 'ngoại lệ' ___ không phải hầu như ___ từ' boost :: exception'. Tôi bối rối và rất thích nghe lời giải thích. – sbi
@sehe: Tôi đã lướt qua các tài liệu nhưng không thấy bất kỳ điều gì có liên quan. Bạn đang ám chỉ cái gì? – sbi