Bài đăng sau thảo luận về loại biểu thức throw
: In C++, if throw is an expression, what is its type?. Tôi muốn làm rõ một điều cơ bản hơn: tại sao phải throw
là một biểu thức và không phải là tuyên bố (không biểu hiện) giống như return
ngay từ đầu? Ý tôi là, có ai muốn viết một cái gì đó như auto x = throw std::runtime_error("Error message")
?Tại sao lại ném một biểu thức?
17
A
Trả lời
11
Nếu throw
là tuyên bố bạn không thể sử dụng nó với toán tử có điều kiện.
return success()
? computation()
: throw std::runtime_error("oops");
Lưu ý: đây có thể hoặc không có công dụng bên ngoài đang hoang mang.
Chỉnh sửa: một trường hợp hữu ích nằm trong các hàm constexpr
nghiêm ngặt của C++ 11 chỉ có thể chứa một lệnh. Cảm ơn @dyp vì thông tin chi tiết!
Các vấn đề liên quan
- 1. Tại sao BitmapSource.Create lại ném một ArgumentException?
- 2. Tại sao '{' ném một NullReferenceException trong một phương thức tĩnh?
- 3. Tại sao biểu thức Haskell này lại quá chậm?
- 4. Tại sao List.remove (int) lại ném java.lang.UnsupportedOperationException?
- 5. Tại sao CLR lại ném ThreadAbortException?
- 6. Tại sao removeOnGlobalLayoutListener ném một NoSuchMethodError?
- 7. Tại sao một hằng số biểu thức, nhưng không phải là một biểu thức khác?
- 8. Tại sao XmlSerializer ném một InvalidOperationException?
- 9. Tại sao ứng dụng asp.net của tôi lại ném ThreadAbortException?
- 10. Tại sao chức năng deallocation không được gọi khi constructor đối tượng ném vào một biểu thức mới?
- 11. Tại sao Observable.Generate() ném System.StackOverflowException?
- 12. Sử dụng ném trong một biểu thức Javascript
- 13. Tại sao PyMongo ném AutoReconnect?
- 14. ImageSourceConverter ném NullReferenceException ... tại sao?
- 15. java.util.Prefs ném BackingStoreException - Tại sao?
- 16. Tại sao PyGILState_Release ném lỗi Python Fatal
- 17. Tại sao MemoryStream.GetBuffer() luôn ném?
- 18. Tại sao System.Web.Hosting.ApplicationHost.CreateApplicationHost ném System.IO.FileNotFoundException?
- 19. Tại sao System.out.println() ném NullPointerException?
- 20. Tại sao NHibernate ném "StaleObjectStateException"?
- 21. Tại sao SortedList.add() ném UnsupportedOperationException?
- 22. Tại sao StreamReader.ReadLine ném OutOfMemoryException?
- 23. Tại sao Iterator.next() ném ConcurrentModificationException
- 24. Tại sao biểu thức F #/OCaml "match" này lại biên dịch?
- 25. Tại sao "ném" và "ném cũ" trong một khối catch hoạt động theo cùng một cách?
- 26. tại sao Contextmanager ném một lỗi thời gian chạy 'máy phát điện không dừng lại sau khi ném()'?
- 27. Tại sao "biểu thức không thể gán" (UIView.frame.origin)?
- 28. Tại sao biểu thức khai báo lại bị loại bỏ trong C# 6?
- 29. Tại sao biểu thức lambda báo giá sắc nét?
- 30. Tại sao là sự khác biệt giữa một biểu thức và một tuyên bố
Một +1 khác cho ghi chú mà tôi đánh giá cao một người nào đó đang nhận xét. Dường như tôi không thể bỏ phiếu hai lần: ( – AlwaysLearning
Cộng một, mặc dù đáng chú ý có lẽ rằng 'throw std :: runtime_error (" oops ")' là một biểu thức của loại 'void' và nó chỉ hoạt động trong một điều kiện do một số thủ thuật kỹ thuật ngăn cản tôi tự trả lời câu hỏi này – Bathsheba
@Bathsheba 'return throw std :: runtime_error (" oops "), 0;' hoạt động quá (nhờ, toán tử dấu phẩy từ không gian bên ngoài!) – Quentin