2016-03-16 19 views
6

Vì vậy, một cuộc trò chuyện nảy sinh cho tôi và một số người bạn xung quanh một đoạn trong tài liệu này page của Elixir.Những tình huống yêu cầu ném/bắt trong Elixir?

Trong Elixir, giá trị có thể được ném và sau đó bị bắt. ném và bắt được dành riêng cho các trường hợp không thể truy xuất giá trị trừ khi sử dụng ném và nắm bắt.

Các tình huống đó không phổ biến trong thực tế ngoại trừ khi giao tiếp với các thư viện không cung cấp API thích hợp.

Trường hợp nào yêu cầu sử dụng try/throw/catch so với try/rescue? Đây có phải là để giao tiếp với một số thư viện Erlang hiện có? Mẫu trên trang hiển thị mã Elixir, điều tôi thấy hơi khó hiểu.

"API thích hợp" mà tôi nên tìm kiếm là gì? Tôi có nghĩa đây sẽ là một giao thức?

+0

Cuốn sách Dave Thomas đưa ra một vài ví dụ: cơ sở dữ liệu đi xuống hoặc máy chủ định danh không phản hồi hoặc không mở được tệp cấu hình có tên cố định. – GavinBrelstaff

+0

Tại sao những tình huống đó đòi hỏi phải nắm bắt chứ không phải là cứu hộ? Đó là những gì tôi hỏi - sự khác biệt ở đó là gì? –

+1

Tôi nên nghiên cứu thêm một chút. Dường như câu hỏi này đã được hỏi và trả lời trong Danh sách cốt lõi của Elixir một thời gian trước: https://groups.google.com/d/topic/elixir-lang-core/0eG2BqKfC_U/discussion –

Trả lời

9

Tôi xem xét nâng cao/giải cứu rõ ràng về xử lý ngoại lệ - có nghĩa là hoàn toàn bất ngờ khi bạn muốn có một stacktrace và một lập trình viên nhìn vào nó. Nó có thể xảy ra vì nhiều thứ - lỗi lập trình viên, môi trường sai, vv, nhưng người dùng cung cấp dữ liệu không hợp lệ không phải là một trong những trường hợp đó.

Việc ném/bắt rất hữu ích ở những nơi bạn đã gặp lỗi, nhưng bạn vẫn muốn sử dụng luồng kiểm soát không cục bộ được cung cấp bằng cách tăng/cứu. Điều này cũng cho phép bạn bỏ qua chi phí xây dựng một stacktrace mà đôi khi đáng kể. ví dụ cổ điển là:

Quy tắc chung của tôi cho lựa chọn cái khác sẽ là bắt cần thiết cho chương trình hoạt động đúng cách trong khi cứu hộ nên có thể tháo rời trong trường hợp chung. Tất nhiên có những ngoại lệ đối với quy tắc đó, nhưng tôi nghĩ đó là một sự phân biệt cấp đầu tiên hữu ích.

+2

Đưa ra nhận xét của bạn và câu trả lời của Jose --Băng tăng tạo ra một dấu vết ngăn xếp và ném không? Đó có phải là một trong những khác biệt nổi bật? –

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