tôi muốn lấy được từ std :: exception để thêm thông tin cụ thể vào tệp nhật ký của tôi, nhưng tôi không thể tìm cách truy cập .what() từ std :: exception.xuất phát từ std :: ngoại lệ
hơn nữa, tôi biết rằng không an toàn để tạo chuỗi trong trình xử lý ngoại lệ của tôi, nhưng tôi không phải là chuyên gia về chủ đề này, vì vậy, một số giải pháp thay thế an toàn hơn là gì?
struct Exception : public std::exception, private boost::noncopyable
{
public:
Exception(std::string msg)
: message(msg)
{}
~Exception()
{}
virtual const char* what() const throw
{
std::string what = message + // and now what? base.what()
LOG(what); // write to log file
return what.c_str();
}
private:
std::string message;
};
EDIT: tôi thực sự đã đặt câu hỏi của mình theo cách sai. Tôi khá hứng thú với sự an toàn, tôi chỉ nghĩ rằng sẽ tốt hơn nếu có nhiều dữ liệu hơn để đăng nhập. tôi đã sai.
bây giờ, tôi không quá hoang tưởng về bad_alloc bị ném bởi chuỗi thư trong trường hợp có một bad_alloc trước đây, tôi muốn có một thông điệp gọn gàng. được nói rằng tôi đã viết lại một số nội dung:
struct Exception : public std::exception
{
public:
Exception(std::string msg)
: message(msg)
{}
~Exception()
{}
virtual const char* what() const throw
{
LOG(what); // write to log file
return what.c_str();
}
private:
std::string message;
};
hiện vẫn còn bất kỳ mối lo ngại lớn nào về mã đó không? các LOG() ném std :: trường hợp ngoại lệ tôi một cái gì đó đi sai, bởi vì tôi không muốn một vòng lặp vô hạn của đăng nhập gọi bằng lớp ngoại lệ có nguồn gốc, và lớp đó một lần nữa gọi đăng nhập mà sẽ gây ra cùng một exeception một lần nữa. Thao tác này có giống như tôi muốn, hoặc sẽ là ngoại lệ ghi nhật ký trong cuộc gọi lớp kết thúc của tôi() hoặc gây ra kết xuất lõi?
Re: Các giải pháp thay thế an toàn hơn. Đây là một câu hỏi lớn. Thích hợp cho câu hỏi riêng của nó. –
Chào mừng bạn đến với Stack Overflow. Có vẻ như bạn đang hỏi * hai * câu hỏi (có nghĩa là bạn nên tạo hai bài đăng riêng biệt). Một yêu cầu làm thế nào để gọi phương thức kế thừa từ lớp cơ sở và phương thức kia yêu cầu cách lưu trữ một thông báo ngoại lệ mà không có chuỗi (có lẽ vì bạn không muốn cấp phát bộ nhớ và phải chịu rủi ro 'bad_alloc'). Không thực sự có bất cứ điều gì liên quan đến việc phát sinh từ 'std :: exception' nói riêng. Các câu hỏi riêng biệt, cụ thể dẫn đến nhiều tiêu đề câu hỏi mô tả hơn và câu trả lời hữu ích hơn. Vui lòng xem xét tách câu hỏi này. –
Nếu mã của bạn ném ngoại lệ loại Ngoại lệ ("..."), bạn mong đợi điều gì std :: exception :: what() trả về? Tôi không nghĩ rằng nó sẽ chứa bất cứ điều gì hữu ích (nếu nó có chứa bất cứ điều gì cả). Tôi sẽ đề nghị chỉ cần trả lại message.c_str(). – Ferruccio