Quy ước là mã Scala không sử dụng null (với một số lượng nhỏ các trường hợp ngoại lệ, nên ngay lập tức được sửa khi sử dụng các chức năng thư viện đó).
Do đó, một số không từ Scala là dấu hiệu cho thấy có điều gì đó sai (ít nhất là PBCAK), vì vậy bạn cũng có thể ném một ngoại lệ. Đây không phải là hoạt động thường xuyên; đây là một cái gì đó nghiêm túc hơi say lên. Nắm bắt ngoại lệ bất cứ nơi nào bạn bắt gặp những trục trặc nghiêm trọng. Bắt một số IllegalArgumentException
thay vì NullPointerException
không thêm thông tin nào. Chỉ cần rời khỏi bản gốc một mình.
Nếu mã đến từ Java, cách kinh điển để xử lý nó là bọc nó trong Option
, sẽ chuyển đổi null
thành None
. Sau đó, bạn có thể thậm chí không cần phải ném một ngoại lệ; chỉ cần trả lại None
.
def myMethod(p: String) = Option(p).map(_.toLowerCase)
Nếu bạn không thể tiếp tục khi không có giá trị, bạn cần xem xét liệu ngoại lệ thông tin có hữu ích hay không. Option(p).orElse(throw new IllegalArgumentException("Null!"))
là một cách nhỏ gọn để thể hiện tình cảm ném ngoại lệ.
Trong Scala 2.10, bạn cũng có thể bọc mọi thứ trong scala.util.Try(...)
sẽ tự động bắt và gói ngoại lệ cho bạn. Nếu bạn muốn có một ngoại lệ đóng gói thay vì một ngoại lệ, đây là cách để đi.(Và sử dụng Try
thay vì Option
.)
import scala.util.Try
def myMethod(p: String) = Try(p.toLowerCase)
Cuối cùng, để xử lý tổng quát hơn các kết quả thay thế, sử dụng Either
. Quy ước xử lý lỗi là kết quả mong đợi là Right(whatever)
, trong khi Left(whatever)
cho biết đã xảy ra sự cố.
Nguồn
2012-11-29 22:49:28
Vì tôi đang viết một API, tôi nghĩ cấu trúc thích hợp hơn là Thử. – j3d
Hãy cẩn thận khi gói các giá trị null trong một Option mặc dù. Nếu bạn dựa vào suy luận kiểu, đôi khi bạn có thể gặp rắc rối. Ví dụ, nếu bạn chọn Option (null) .map (_ + 1) bạn sẽ được miễn trừ. Tuy nhiên, làm Option (null: String) .map (_. ToLowerCase) là tốt –