2010-11-08 36 views
5

Điều gì có thể là tác động của việc có một hàm thành viên setter trong một lớp ngoại lệ? Động cơ để có một setter là đôi khi không có đủ dữ liệu có sẵn tại các điểm ném để xử lý các trường hợp ngoại lệ đúng tại điểm bắt; vì vậy thông tin bổ sung phải được thêm vào khi ngăn xếp đang được mở.Setter trong lớp ngoại lệ

+1

Âm thanh như ý tưởng hợp lý. – Jay

+1

và mã nào sẽ chạy * trong khi * ngăn xếp đang được mở ra? – Anon

+0

Ông có nghĩa là trong một khối catch. – Skurmedel

Trả lời

3

Trong khi bạn có thể bác sĩ ngoại lệ ban đầu, tôi thích kỹ thuật được sử dụng trong Java: bạn nắm bắt được bản gốc và ném một ngoại lệ mới đề cập đến nguyên bản là nguyên nhân của nó.

+0

@Anon: và bạn vừa mất khung ngăn xếp ... –

+0

@Matthieu: Đồng ý. Nếu bạn ném một ngoại lệ mới, bạn sẽ mất thông tin gỡ lỗi ngăn xếp. – Puppy

+0

Nhúng bản gốc có thể khiến bạn gặp vấn đề về cắt, nếu bạn bắt được một lớp cơ sở nhưng ngoại lệ bị bắt là một thứ bắt nguồn. Bạn sẽ cần phải ném và bắt bằng con trỏ, nhưng đó không phải là điển hình và tạo ra một vài vấn đề của riêng nó. –

1

Trước hết, điều này nghe có vẻ như là một ý tưởng hay.

Tôi sử dụng SEH (xử lý ngoại lệ dành riêng cho cửa sổ, không liên quan đến C++) thay vì xử lý ngoại lệ C++. Đặc biệt vì điều này - nó cho phép thu thập nhiều thông tin hơn trước khi bắt đầu thư giãn bắt đầu.

Nhưng tôi chưa bao giờ nghĩ đến việc ném loại sẽ thu thập thông tin.

Nói một cách kỹ thuật - không có vấn đề gì. Tôi biết làm thế nào xử lý ngoại lệ được thực hiện bởi MSVC (lên đến cấp độ lắp ráp), và không có gì sai với ý tưởng. Có một số điểm cần được nhắc tới:

  1. Khối catch được gọi sau ngăn xếp đã được unwound. Để mọi thứ trong khối try thích hợp có đã bị hủy.
  2. Làm lại một ngoại lệ gây ra hiệu suất đáng kể.
1

Tôi đoán vấn đề cơ bản là mã ném (cấp thấp) không có nhiều ngữ cảnh/thông tin như mã tăng thêm sẽ có.

Bạn có thể tạo ngoại lệ mới mô tả ngoại lệ tốt hơn, bao gồm ngoại lệ ban đầu dưới dạng ngoại lệ bên trong. Tôi đã làm điều này một vài lần nhưng tôi nhận ra điều này là hầu như không thực tế trong mọi hoàn cảnh.

Tôi biết một số khung công tác có chất lượng "Dữ liệu", ít nhiều là một từ điển có dữ liệu tùy ý. Nó không tệ với tôi, mặc dù nó mở ra cho sự lạm dụng. Nó có lẽ không nên được sử dụng để đưa ra quyết định có lập trình, nó nên được cho con người tiêu thụ.

Nếu có điều gì đó xảy ra ngoại lệ và đưa ra quyết định dựa trên tham số X, nó có thể trở nên khá lộn xộn.

5

Kiểm tra thư viện Boost.Exception và chính xác nhất this page trong đoạn mang tên Thêm các Arbitrary dữ liệu Active Exception Objects:

void parse_file(char const * file_name) 
{ 
    boost::shared_ptr<FILE> f = file_open(file_name,"rb"); 
    assert(f); 
    try 
    { 
     char buf[1024]; 
     file_read(f.get(), buf, sizeof(buf)); 
    } 
    catch(boost::exception & e) 
    { 
     e << boost::errinfo_file_name(file_name); 
     throw; 
    } 
} 

Cá nhân tôi tìm ra kỹ thuật khá hiệu quả. Sửa đổi các ngoại lệ (thêm ngữ cảnh) và rethrow.

Trái với Java, trong C++ bạn quyết định có bao gồm khung ngăn xếp khi xây dựng ngoại lệ của mình hay không, vì vậy bạn không chịu rủi ro mất nó và nó vẫn sẽ trỏ đến điểm mã đã ném ngoại lệ đầu tiên, trong khi có ngữ cảnh quan trọng.

+1

Tìm kiếm trong Boost có vẻ giống như một sự chứng thực tốt về kỹ thuật này, ngay cả khi bạn không thích sử dụng Boost. –

Các vấn đề liên quan