2009-03-27 30 views

Trả lời

25

Có, đó là thực hành tốt để inherit từ std::runtime_error hoặc other standard exception classes như std::logic_error, std::invalid_argument và như vậy, tùy thuộc vào loại trừ nó được.

Nếu tất cả ngoại lệ được thừa kế theo cách nào đó từ std::exception, thật dễ dàng để bắt tất cả các lỗi phổ biến theo số catch(const std::exception &e) {...}. Nếu bạn có một số hệ thống phân cấp độc lập, điều này sẽ phức tạp hơn. Bắt nguồn từ các lớp ngoại lệ chuyên biệt làm cho các ngoại lệ này mang nhiều thông tin hơn, nhưng cách hữu ích này thực sự phụ thuộc vào cách bạn xử lý ngoại lệ của mình.

+6

Bắt bởi const ref: bắt (std :: exception const & e) –

+0

có, tốt hơn, thay đổi nó ... – sth

1

Theo tôi, không quan trọng nếu bạn kế thừa từ std :: exception hay không. Đối với tôi, điều quan trọng nhất về việc xác định ngoại lệ là:

  1. Có tên lớp ngoại lệ là hữu ích và rõ ràng.
  2. Ghi rõ ràng (viết nhận xét) khi ngoại lệ sẽ bị ném bởi hàm hoặc phương thức lớp. Đây là điểm thất bại lớn nhất trong xử lý ngoại lệ theo ý kiến ​​của tôi.
1

Nó không tạo sự khác biệt lớn, kể từ std::runtime_error cũng được kế thừa từ std::exception. Bạn có thể tranh luận rằng lỗi thời gian chạy truyền tải nhiều thông tin hơn về ngoại lệ, nhưng trong thực tế, mọi người thường chỉ xuất phát từ lớp ngoại lệ cơ bản.

6

Tôi không phải là một ++ phát triển C, nhưng có một điều chúng tôi đã làm trong C# mã của chúng tôi là tạo ra một ngoại lệ lớp cơ sở cho khung của chúng tôi, và sau đó đăng nhập vào ném ngoại lệ trong các nhà xây dựng:

public FrameworkException(string message, Exception innerException) 
     : base(message, innerException) 
    { 
     log.Error(message, innerException); 
    } 

    ... 

Bất kỳ nguồn gốc ngoại lệ chỉ cần gọi nó là constructor cơ sở và chúng ta có được sự ghi nhật ký ngoại lệ nhất quán trong suốt. Không phải là một việc lớn, nhưng hữu ích.

+0

Bạn phải cẩn thận với ngoại lệ ưa thích, đặc biệt khi xây dựng ngoại lệ. – Herbert

3

Tốt nhất là khi ngoại lệ được đặt trong một phạm vi nào đó. Ví dụ lớp Thao tác có thể khai báo bên trong các lớp ngoại lệ Lỗi.

và bắt họ như

catch (const Manipulation::InputError& error) 
catch (const Manipulation::CalculationError& error) 

Trong những trường hợp như vậy, họ có thể chỉ là lớp học trống mà không cần bất kỳ thông tin bổ sung lỗi trừ khi bạn thiết kế cho phép những trường hợp ngoại lệ bay nhiều trên nơi bạn bắt tất cả các trường hợp ngoại lệ chuẩn.

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