Tôi không biết có hay không có một lý thuyết, nhưng có thể có một khoa học thực nghiệm mới nổi.
Nguồn tốt nhất tôi có thể nghĩ đến là Bjarne Stroustrup, Thiết kế và tiến hóa của C ++, Addison-Wesley, 1994 . Nếu tôi nhớ chính xác (đó là một cuốn sách rất hay và mọi người cứ mượn nó từ tôi và không trả lại, vì vậy tôi không có một bản sao vào lúc này) có một chương về các trường hợp ngoại lệ. Ủy ban C ++ thuộc Stroustrup yêu cầu rất nhiều bằng chứng thực nghiệm rằng một tính năng được đề xuất là cần thiết trước khi họ sẵn sàng thêm nó vào định nghĩa ngôn ngữ. Các trang Wikipedia về trường hợp ngoại lệ có trích dẫn sau đây từ cuốn sách đó:
Tại cuộc họp Palo Alto [tiêu chuẩn hóa C ++] vào tháng 11 năm 1991, chúng tôi đã nghe một bản tóm tắt tuyệt vời về các lý lẽ cho ngữ nghĩa chấm dứt được hỗ trợ với cả kinh nghiệm cá nhân và dữ liệu từ Jim Mitchell (từ Sun, trước đây từ Xerox PARC). Jim đã sử dụng xử lý ngoại lệ trong nửa tá ngôn ngữ trong khoảng thời gian 20 năm và là người đầu tiên đề xuất ngữ nghĩa nối lại với tư cách là một trong những nhà thiết kế và thực hiện chính của hệ thống Cedar / Mesa của Xerox. Thông điệp của ông là chấm dứt được ưu tiên hơn nối lại; đây không phải là vấn đề quan điểm mà là vấn đề nhiều năm kinh nghiệm. Tiếp tục là quyến rũ, nhưng không hợp lệ. Ông ủng hộ tuyên bố này với kinh nghiệm từ một số hệ điều hành. Ví dụ chính là Cedar / Mesa: Nó được viết bởi những người thích và sử dụng nối lại, nhưng sau mười năm sử dụng, chỉ có một lần sử dụng nối lại trong hệ thống nửa triệu - và đó là một cuộc điều tra bối cảnh. Bởi vì việc nối lại thực sự không cần thiết cho một cuộc điều tra bối cảnh như vậy, họ đã loại bỏ nó và tìm thấy sự gia tăng tốc độ đáng kể trong phần đó của hệ thống. Trong mọi trường hợp sử dụng lại, nó đã được sử dụng - trong mười năm - trở thành một vấn đề và một thiết kế phù hợp hơn đã thay thế nó. Về cơ bản, mỗi lần sử dụng nối lại đã thể hiện sự thất bại trong việc tách rời các mức độ trừu tượng riêng biệt. Trong mọi trường hợp sử dụng lại, nó đã được sử dụng - trong mười năm - trở thành một vấn đề và một thiết kế phù hợp hơn đã thay thế nó. Về cơ bản, mỗi lần sử dụng nối lại đã thể hiện sự thất bại trong việc tách rời các mức độ trừu tượng riêng biệt. Trong mọi trường hợp sử dụng lại, nó đã được sử dụng - trong mười năm - trở thành một vấn đề và một thiết kế phù hợp hơn đã thay thế nó. Về cơ bản, mỗi lần sử dụng nối lại đã thể hiện sự thất bại trong việc tách rời các mức độ trừu tượng riêng biệt.
Trong C ++, phần thắng thực sự là RAII , giúp xử lý việc phân bổ tài nguyên dễ dàng hơn trong các lỗi. (Nó không làm mất đi nhu cầu throw
và try
- catch
nhưng điều đó có nghĩa là bạn không cần finally
.)
Tôi nghĩ rằng điều thuyết phục họ mà họ cần ngoại lệ là các thùng chứa chung: người viết container không biết gì về các loại lỗi mà các đối tượng chứa có thể cần trả về (ít hơn nhiều cách xử lý chúng), nhưng mã đã chèn các đối tượng đó vào container phải biết điều gì đó về giao diện của các đối tượng đó. Nhưng vì chúng ta không biết gì về loại lỗi mà các đối tượng có thể gây ra, chúng ta không thể tiêu chuẩn hóa các loại ngoại lệ. (Tương ứng: nếu chúng ta có thể tiêu chuẩn hóa các loại ngoại lệ thì chúng ta sẽ không cần ngoại lệ.)
Một điều khác mà mọi người dường như đã học được trong nhiều năm qua là các thông số kỹ thuật ngoại lệ khó có thể đưa vào một ngôn ngữ chính xác. Xem ví dụ này: http://www.gotw.ca/publications/mill22.htm hoặc này: http://www.gotw.ca/gotw/082.htm . (Và không chỉ C ++, các lập trình viên Java cũng có những tranh luận dài dòng về trải nghiệm của họ với các ngoại lệ được kiểm tra so với không được kiểm tra .)
Một chút về lịch sử của ngoại lệ. Bài viết kinh điển là: John B. Goodenough: "Xử lý ngoại lệ: các vấn đề và ký hiệu được đề xuất," Cộng đồng . ACM 18 (12): 683-696, 1975. Nhưng các trường hợp ngoại lệ đã được biết trước đó. Mesa có chúng vào khoảng năm 1974 và PL / tôi cũng có thể có chúng. Ada đã có một cơ chế ngoại lệ trước năm 1980. Tôi tin rằng các ngoại lệ của C ++ bị ảnh hưởng nhiều nhất bởi trải nghiệm với ngôn ngữ lập trình CLU của Barbara Liskov từ khoảng năm 1976. Barbara Liskov: "Lịch sử của CLU", trong Lịch sử ngôn ngữ lập trình --- II , Thomas J. Bergin, Jr. và Richard G. Gibson, Jr. (biên soạn). trang 471-510, ACM, 1996 .