2016-08-03 18 views
6

Tiêu đề <stdexcept> xác định một vài ngoại lệ tiêu chuẩn. Tuy nhiên, tôi gặp khó khăn khi quyết định khi nào nên sử dụng ngoại lệ nào. Có hướng dẫn tốt để được tìm thấy trên mạng không? Tôi cố gắng minh họa vấn đề của tôi với một ví dụ:C++ Khi nào nên sử dụng ngoại lệ (chuẩn) nào?

Một hàm có độ dài của một vectơ (vật lý) và một góc (giữa 0 và pi) để trả lại vectơ mới. Nếu góc âm là

  1. A std::invalid_argument, vì góc âm không hợp lệ?
  2. A std::logic_error, vì các góc âm không có ý nghĩa trong trường hợp này?
  3. A std::out_of_range, vì các góc âm nằm ngoài phạm vi cho phép của các góc?
  4. A std::domain_error, vì hàm toán học không được xác định trên các góc âm.
  5. Hoặc tôi có nên xác định ngoại lệ tùy chỉnh không?

(Trong trường hợp ai tự hỏi: Tôi đang cố gắng để thay đổi tọa độ trong một hộp mô phỏng triclinic, mà thực sự là ba độ dài và ba góc - xem here nếu bạn quan tâm.)

+0

Điều này hoàn toàn tùy thuộc vào bạn. Không có vấn đề gì ngoại lệ được ném, trừ khi họ đang bị bắt họ sẽ hủy bỏ vấn đề. Vì vậy, bất cứ điều gì ngoại lệ bạn quyết định bạn sẽ ném, bạn sẽ bắt một nơi nào đó. Vì vậy, nó hoàn toàn tùy thuộc vào bạn. –

+0

Bạn có thể muốn giới thiệu các loại ngoại lệ của riêng bạn để phân biệt lỗi của bạn với các loại tiêu chuẩn. – Jarod42

+0

Ok, tôi phải tìm ra hướng dẫn của riêng mình sau đó. Có mô tả chi tiết hơn về trường hợp ngoại lệ tiêu chuẩn nào được đề xuất hay không. Các mô tả trên cả [cppreference.com] (http://en.cppreference.com/w/cpp/header/stdexcept) và [cplusplus.com] (http://www.cplusplus.com/reference/stdexcept/) cực kỳ ngắn gọn. –

Trả lời

7

Các ý cho những ngoại lệ :

std::invalid_argument:

Định nghĩa một loại đối tượng được ném như là ngoại lệ. Nó báo cáo lỗi phát sinh do giá trị đối số chưa được chấp nhận.

std::logic_error:

Định nghĩa một loại đối tượng được ném như là ngoại lệ. Nó báo cáo lỗi là hậu quả của logic bị lỗi trong chương trình như vi phạm điều kiện tiên quyết hợp lý hoặc bất biến lớp và có thể ngăn ngừa được.

Không có thành phần thư viện chuẩn ném ngoại lệ này trực tiếp, nhưng các loại ngoại lệ std::invalid_argument, std::domain_error, std::length_error, std::out_of_range, std::future_error, và std::experimental::bad_optional_access có nguồn gốc từ std::logic_error.

std::out_of_range:

Định nghĩa một loại đối tượng được ném như là ngoại lệ. Nó báo cáo lỗi là hậu quả của việc cố gắng truy cập các phần tử ngoài phạm vi được xác định.

std::domain_error:

Định nghĩa một loại đối tượng được ném như là ngoại lệ. Nó có thể được sử dụng bởi việc triển khai để báo cáo các lỗi miền, tức là các tình huống trong đó các đầu vào nằm ngoài miền mà một hoạt động được xác định.


Cho rằng, tôi sẽ loại trừ sử dụng std::logic_errorstd::out_of_range cho tình hình của bạn.

std::ivalid_argument ít cụ thể hơn std::domain_error. Do đó, đề xuất của tôi sẽ là sử dụng std::domain_error.

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