2011-02-08 25 views
7

Bạn có thể gọi throw; từ nhà xây dựng nếu có điều gì đó không ổn và bạn không biết cách khôi phục?ném mà không có đối số cho báo hiệu lỗi

Ý tưởng là để cho ứng dụng gặp sự cố với kết xuất, vì trạng thái không xác định. Hoặc bạn nên luôn luôn chỉ định một đối số?

Từ MSDN tôi chỉ thấy rằng nó trả về nếu không có đối số, nhưng không biết điều gì sẽ xảy ra nếu không có ngoại lệ ban đầu để tính lại.

+0

Nếu bạn muốn gặp sự cố, chỉ cần 'hủy bỏ()' hoặc 'xác nhận (sai)'. Điều đó sẽ cung cấp một kết xuất (tùy thuộc vào cấu hình hệ thống của bạn) và ít gây nhầm lẫn hơn là một thông báo lỗi nói rằng chương trình đã kết thúc vì một 'ném;' mà không có ngoại lệ trước. –

Trả lời

11

Nếu không có ngoại lệ nào đang được xử lý throw; sẽ dẫn đến terminate() being called immediately và điều đó sẽ kết thúc chương trình của bạn bất thường. Điều đó không thuận tiện lắm - bạn sẽ có ít thông tin hơn về những gì đã xảy ra so với việc ném một ngoại lệ có ý nghĩa. Bạn có thể đã ném một ngoại lệ có ý nghĩa, bắt nó ở cấp cao nhất (như main()), viết một số chẩn đoán và sau đó kết thúc chương trình.

+1

Có một lợi thế nhỏ trong một bãi chứa chương trình: bạn có thể kiểm tra trạng thái của toàn bộ chương trình là gì và cố gắng phân tích cách hệ thống có được ở đó. Tôi có xu hướng ném một ngoại lệ khi bạn có thể phục hồi, và chết khi bạn không thể, để hầu hết nhà nước có thể được xử lý. –

+0

Hmm, có, việc bỏ chọn ngăn xếp không mong muốn trong trường hợp này. Nhưng Terminate cũng không lưu thông tin stack, phải không? – Coder

1

Về mặt kỹ thuật, bạn có thể làm điều đó vì không có đối số và không có ngoại lệ hoạt động chỉ cần gọi terminate() theo mặc định, gọi là abort(). Tôi thích gọi trực tiếp số abort(), nó đòi hỏi ít nỗ lực nhận thức hơn để nhận ra những gì đang diễn ra.

2

một khẳng định có thể làm cho cuộc sống của bạn dễ dàng hơn để dignose những gì đang xảy ra sai

+0

Không hoạt động trong bản phát hành bản phát hành. –

+0

@Maxim: nếu bạn thử nghiệm toàn diện, bạn không cần thử nghiệm trong bản phát hành bản phát hành (tôi thường giữ bài kiểm tra nhưng thay vào đó hãy ném ...) –

+1

Một số lỗi chỉ có thể tự tiết lộ trong bản phát hành bản phát hành. –

9

số throw; là một cú pháp đặc biệt mà lại ném ngoại lệ hiện hành. Nó chỉ có ý nghĩa bên trong các khối catch (hoặc mã được gọi từ một) để tiếp tục truyền bá ngoại lệ.

Chỉ cần sử dụng:

#include <stdexcept> 
... 
throw std::runtime_error("some description"); 

hoặc thậm chí chỉ

throw "some description"; 

nhưng sau đó là xấu xí để xử lý và chỉ nói chung tán thành.

+0

Về mặt kỹ thuật, bạn có thể sử dụng 'ném;' ở bất kỳ đâu. – sharptooth

+0

không sử dụng 'ném' một số mô tả ";', những gì bạn ném nên xuất phát từ 'std :: exception', hoặc người nào khác boogeyman sẽ đến và giúp bạn có được. –

+0

@sharptooth: Đã chỉnh sửa "chỉ có thể được sử dụng" -> "chỉ có ý nghĩa" là chính thức chính xác. –

2

Trong khi về mặt kỹ thuật, bạn có thể gọi nó, nó sẽ không làm những gì bạn muốn.

Giải pháp đơn giản nhất là gọi throw std::runtime_exception("thrown from Foo");, đồng thời đưa ra một số phản hồi về những gì đang diễn ra.

+0

Chỉ cần làm cho lớp ngoại lệ gây tử vong của bạn nắm bắt được dấu vết ngăn xếp. –

+0

@Maxim: Vâng, rất tiện dụng, thực ra tất cả các ngoại lệ của chúng tôi đều làm cho việc theo dõi chúng trở nên dễ dàng hơn. –

2

Khi bạn nói "không có ý tưởng làm thế nào để phục hồi" những gì bạn có nghĩa là tôi đoán là tại thời điểm này bạn không biết làm thế nào để xử lý lỗi?

Có lẽ bạn không nhận được điểm ngoại lệ. Bạn ném thông tin: rằng ngoại lệ xảy ra và tại sao. Các cuộc gọi ngăn xếp sau đó là unwound đến điểm mà nó có thể được xử lý. Vào thời điểm đó trong mã chúng ta biết làm thế nào, nếu có thể, để phục hồi.

+0

Có, một số điều không thể xảy ra, bất ngờ xảy ra, như lỗi không có giấy tờ trong thư viện của bên thứ ba, lỗi bộ nhớ, bit lật hoặc thứ gì đó tương tự. – Coder

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