Đây là câu hỏi hay.Sau khi nghiên cứu một chút.
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.
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
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) –