2012-01-23 18 views

Trả lời

3

Vâng, cũng có tốt cũ

ON ERROR RESUME NEXT 

Ngoài ra, một số ngôn ngữ lập trình (một số Lisps và Đề án, có lẽ Smalltalk) riêng biệt nâng cao một ngoại lệ từ thoát (ví dụ, tháo stack). Đó là, có thể trong một số trường hợp để xử lý một ngoại lệ trong bối cảnh nó được nâng lên và tiếp tục tính toán --- chúng được gọi là ngoại lệ liên tục.

2

Có giá trị trả lại cũ tốt. GO thực sự sử dụng giá trị trả lại thay vì ngoại lệ. Vì C không có cơ chế ngoại lệ, nó cũng sử dụng giá trị trả về, cộng với biến toàn cầu (errno).

Chỉnh sửa Thông tin của tôi về GO có vẻ đã lỗi thời, vì bây giờ nó có cơ chế xử lý ngoại lệ. Tuy nhiên, các giá trị trả lại có thể được sử dụng để báo cáo lỗi.

3

Nói chung, có vẻ như lỗi xử lý các chiến lược có thể được chia thành ba loại:

  • Không làm gì cả (ON ERROR RESUME NEXT, như Ryan đề cập)
  • Nêu rõ lỗi/thất bại trong một mã trở lại. Điều này có thể, trong một số trường hợp, là tham số đầu ra bổ sung, chẳng hạn như con trỏ tới chỉ báo lỗi được đặt trong trường hợp lỗi.
  • Gọi luồng kiểm soát thay thế. Điều này có thể cực kỳ (gọi số abort() để ngừng chương trình lạnh), hoặc mang hình thức xử lý ngoại lệ hoặc một cái gì đó tương tự.

Có một số cách triển khai và kiểu luồng kiểm soát thay thế. Một là tín hiệu POSIX, thường dẫn đến kết thúc chương trình theo mặc định. Visual Basic cũng có một cơ sở điều khiển luồng thay thế trong ON ERROR GOTO.

Perl kết hợp kiểm soát dòng chảy thay thế và trở về bằng cách sử dụng mã die, mà làm cho chương trình chấm dứt, trong subinterpreters mà chạy die trong một eval 'd kết quả khối trong một mã lỗi được đặt trong mã gọi.

Sau đó, tất nhiên, có xử lý ngoại lệ truyền thống, cùng với các biến thể như trường hợp ngoại lệ có thể khởi động lại/tiếp tục lại của Common Lisp. Ngay cả tín hiệu/cách tiếp cận abort()ON ERROR GOTO có thể được coi là hệ thống xử lý ngoại lệ nguyên thủy. Vì vậy, xem xét ngoại lệ rộng rãi, hầu hết các hệ thống xử lý lỗi dòng điều khiển thay thế có thể được coi là một dạng xử lý ngoại lệ.

Thực tế việc triển khai ngoại lệ sẽ mở ra một bộ không gian thiết kế thú vị. Có một số cách triển khai ngôn ngữ có thể thực hiện:

  1. Đặt cờ/giá trị trả lại bất thường và trả lại người gọi.Những gì Perl yêu cầu bạn làm một cách rõ ràng - die và kiểm tra biến lỗi $? - là một phiên bản thủ công của phương pháp này. Một ngôn ngữ lập trình làm việc này sử dụng phương thức xử lý lỗi trả về mã để thực hiện các ngoại lệ và có thể phơi bày chúng thông qua một cấu trúc try-catch; Vala là một ví dụ điển hình về điều này.
  2. Làm gió ngăn xếp (như thể các hàm trả về) cho trình xử lý ngoại lệ và chạy nó. Điều này có thể được thực hiện trực tiếp, hoặc bằng máy ảo hoặc bằng cách kiểm tra ngăn xếp. Nó cũng có thể được mô phỏng với (2); khi được sử dụng để thực hiện các ngoại lệ, hai cách tiếp cận này tương đương nhau về mặt ngữ nghĩa.
  3. Gọi mã xử lý ngoại lệ trong phạm vi động của mã sẽ ném lỗi. Đây là những gì Common Lisp thực hiện với cấu trúc condition-case của nó - trình xử lý lỗi được chạy mà không cần gỡ bỏ ngăn xếp, và sau đó cho biết liệu lỗi có được xử lý bằng cách thử lại hay bằng cách tháo gỡ.
  4. Sử dụng double-barrelled continuation passing. Trong kiểu chuyển tiếp tiếp tục bình thường (CPS), thay vì trả về một giá trị, một hàm gọi một hàm khác (được gọi là sự tiếp nối) được cung cấp bởi người gọi của nó như là một trong các đối số của nó với kết quả là "tiếp tục" tính toán. Trong CPS hai nòng, người gọi cung cấp hai tiếp tục: một cho kết quả bình thường và một cho lỗi. Điều này có thể được sử dụng để thực hiện ngữ nghĩa tương đương với ngữ nghĩa của (1) và (2), nhưng là một chiến lược thay thế thú vị có thể mở ra cơ hội xây dựng ngữ nghĩa thú vị hơn.

Vì vậy, tóm lại: có ba cách tiếp cận cơ bản: bỏ qua lỗi, mã trả lại và nhiều cơ sở giống như ngoại lệ khác. Nhưng trong không gian của các cơ sở giống như ngoại lệ, có nhiều tùy chọn cho ngữ nghĩa hoặc giao diện và để thực hiện các ngữ nghĩa đó.

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