2016-10-27 13 views
9

Bối cảnh

Cả hai try/rescuetry/catch là các kỹ thuật xử lý lỗi trong Elixir. Theo số corresponding chapter trong hướng dẫn giới thiệu.Elixir - try/catch vs try/rescue?

lỗi có thể được cứu sống bằng cách sử dụng try/rescue xây dựng

Mặt khác,

throwcatch được dành riêng cho tình huống mà nó không thể lấy một giá trị trừ bằng cách sử dụng throwcatch.

nghi ngờ

Tôi có một sự hiểu biết ngắn gọn rằng rescue là lỗi. Trong khi catch là cho bất kỳ giá trị nào.

Tuy nhiên,

  • Khi nào tôi nên tận dụng các cơ chế xử lý trong Elixir lỗi?
  • Sự khác nhau giữa chúng một cách chi tiết là gì?
  • Tôi nên chọn một tài khoản để sử dụng trong một trường hợp sử dụng cụ thể?
  • Chính xác những gì là 'các trường hợp không thể truy xuất giá trị trừ khi sử dụng throwcatch'?
+3

Bạn hoàn toàn không nên sử dụng chúng;) Đây không phải là Java mà bạn muốn 'try/catch' tất cả các lỗi. Bạn nên sử dụng người giám sát khi xảy ra lỗi để làm cho ứng dụng của bạn mạnh mẽ hoặc sử dụng tăng bất cứ khi nào lỗi xảy ra. – PatNowak

+0

Bản sao có thể có của [Các tình huống yêu cầu ném/bắt trong Elixir?] (Http://stackoverflow.com/questions/36036480/which-situations-require-throw-catch-in-elixir) –

Trả lời

14

Đây là câu hỏi hay.Sau khi nghiên cứu một chút.

  • Sự khác nhau giữa chúng trong chi tiết là gì?

    José của câu trả lời:

Chủ yếu, bạn nên sử dụng throw để kiểm soát dòng chảy và trữ raise lỗi, mà xảy ra trên sai lầm nhà phát triển hoặc trong những trường hợp đặc biệt.

Trong Elixir, sự khác biệt này là khá lý thuyết, nhưng họ có vấn đề trong một số ngôn ngữ như Ruby, nơi sử dụng lỗi/trường hợp ngoại lệ cho kiểm soát dòng chảy là tốn kém vì tạo ra các đối tượng ngoại lệ và backtrace là tốn kém.

  • Tôi nên chọn một tài khoản để sử dụng trong trường hợp sử dụng cụ thể?

Vui lòng kiểm tra câu trả lời này Which situations require throw catch in Elixir

Ngay:

raise/rescue

Xem xét tăng/cứu được một cách rõ ràng về xử lý ngoại lệ (một số tình huống bất ngờ như lỗi lập trình viên, môi trường sai, vv).

throw/catch

Hữu ích ở những nơi bạn đã gặp lỗi. ví dụ cổ điển là:

Cuối cùng một:

  • Chính xác thì đâu là trường hợp không thể truy lục giá trị trừ khi sử dụng lệnh ném và bắt '?

Hãy nói rằng bạn đang cố gắng để chạy một số mã từ một quá trình được giám sát bởi một Supervisor nhưng quá trình chết cho một lý do bất ngờ.

try do 
IO.inspect MayRaiseGenServer.maybe_will_raise 
rescue 
    RuntimeError -> IO.puts "there was an error" 
end 

MayRaiseGenServer được giám sát bởi một Supervisor và vì một lý do một lỗi được nâng lên:

try do 
IO.inspect MayRaiseGenServer.maybe_will_raise # <- Code after this line is no longer executed 

Và sau đó bạn có thể đưa ra sử dụng bắt một ngoại lệ ở đây:

try do 
    IO.inspect MayRaiseGenServer.maybe_will_raise 
catch 
    :exit, _ -> IO.puts "there was an error" 
end 

Ok Hy vọng rằng làm rõ đủ những gì chúng tôi đang tìm kiếm.

+1

Cảm ơn bạn đã nghiên cứu, tốt giải thích :) – Gavin

+0

Bạn được chào đón :) – TheAnh