2012-01-02 24 views
6

bất kỳ cách nào để mô phỏng try-finally hoặc try-except bằng ngôn ngữ không có chúng?Cách mô phỏng thử cuối cùng hoặc thử ngoại trừ các ngôn ngữ không có chúng

Nếu có một số ngẫu nhiên, không thể đoán trước, ngoại lệ xảy ra, tôi cần phải chắc chắn một số lần dọn dẹp.

i có thể hãy thử đảm bảo rằng không có ngoại lệ nào bị ném, theo cách đó tôi chắc chắn mã dọn dẹp của tôi luôn chạy - nhưng sau đó tôi sẽ không cần try-finally/except.

Ngay lúc này, tôi đang cố gắng tạo một try-finally ở Lua; nhưng tôi nghĩ rằng bất kỳ giải pháp sẽ làm việc trong các ngôn ngữ khác là tốt.

Mặc dù, đối với cuộc sống của tôi, tôi không thể tìm ra cách xử lý ngoại lệ mà không có hệ thống ống nước do cơ sở hạ tầng ngôn ngữ cung cấp.

Nhưng đừng bao giờ yêu cầu.

+0

Chức năng "khẳng định" có phải là một tùy chọn không? http://www.lua.org/pil/8.3.html – Will

+0

@ Sẽ không có vấn đề gì với các trường hợp ngoại lệ bị tôi ném hoặc tôi không *. tôi chỉ cần ngăn họ lại. Có thể 'khẳng định' làm điều đó không? –

+0

Có, tôi tin rằng khẳng định sẽ ngăn chặn các ngoại lệ bị ném và cho phép bạn tăng ngoại lệ của riêng mình thay thế. Oh, và những gì Gerald đăng là một chức năng tốt nữa, pcall. Tôi không quá quen thuộc với việc xử lý lỗi trong Lua, nhưng tôi tin rằng có một vài chức năng sẽ làm những gì bạn muốn. – Will

Trả lời

16

Lúa đã có các cơ chế cần thiết để làm điều gì đó không hoàn toàn khác với ngoại lệ. Cụ thể là pcall.

Bạn có thể sử dụng pcall để thực thi bất kỳ chức năng Lua nào. Nếu chức năng đó (hoặc bất kỳ chức năng nào nó gọi) gọi error (assert gọi error nếu điều kiện xác nhận không đúng), thì điều khiển luồng sẽ trở lại trang web của câu lệnh pcall. pcall sẽ trả về false và thông báo lỗi (thông báo lỗi được chuyển đến error).

Với điều này, bạn có thể "ném" lỗi và "bắt" chúng. "Thử" của bạn chỉ là pcall; câu lệnh "bắt" của bạn là điều kiểm tra kết quả pcall.

Ngoài ra, hãy nhớ: Lua là môi trường thu thập rác. Bạn không cần phải làm bất kỳ công việc dọn dẹp nào. Hoặc nếu bạn làm, bạn cần phải thay đổi bất cứ điều gì Lua mô-đun yêu cầu nó. API Lua phải là API Lua, không phải API C hoặc C++.

+0

Trong trường hợp này * " cleanup "* có nghĩa là:' suppressFlag ++; pcall (doStuff); suppressFlag -; 'Và có vẻ như nỗi sợ ban đầu của tôi là đúng - mà không cần hỗ trợ ngôn ngữ bắt các lỗi tùy ý không phải là một khả năng. Nhưng công việc tuyệt vời trong việc tìm kiếm' pcall'. googled cho abou t 5 phút và không thể tìm thấy bất cứ điều gì. –

2

Không bao giờ được lập trình trong lua (đó là những gì bạn có thẻ này được gắn thẻ). Tuy nhiên, một số trang web bao gồm một trang http://jessewarden.com/2011/01/lua-for-actionscript-developers.html đã đề cập rằng cuộc gọi được bảo vệ (pcall) là thiết bị xử lý lỗi lua.

Hy vọng điều này sẽ hữu ích.

0

Nói chung, ngoại lệ có thể bị bắt khi sử dụng hàm signal(). Không chắc chắn rằng lua sẽ hỗ trợ như vậy mặc dù. Trong C, đó là những gì bạn muốn sử dụng. Và đó là một sự khó chịu lớn! (hơi phức tạp.)

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