Tại sao nên một thích lựa chọn cho error handling trong trường hợp ngoại lệ ở Scala?


+1 Phiếu
Đã hỏi 24/5/2016 bởi shady (320 điểm)
Vì vậy, tôi đang học tập functional Scala, và cuốn sách của ông exception phá vỡ referential minh bạch, và do đó Option nên được sử dụng để thay thế, như vậy:
def pattern(s: String): Option[Pattern] = {
  try {
    Some(Pattern.compile(s))
  } catch {
    case e: PatternSyntaxException => None
  }
}
, điều này có vẻ như khá xấu; Tôi có nghĩa là nó có vẻ như tương đương với:
catch(Exception e){
    return null;
}
tiết kiệm cho một thực tế rằng chúng tôi có thể phân biệt "null cho lỗi" từ "null như chính hãng giá trị". Có vẻ như nó nên ít trở về một cái gì đó có chứa các thông tin error như:
catch {
    case e: Exception => Fail(e)
}
tôi mất những gì?

2 Câu trả lời

0 Phiếu
Đã trả lời 01/6/2016 bởi hikel (180 điểm)
Lúc này là một phần cụ thể Option được sử dụng chủ yếu như là một ví dụ bởi vì operation sử dụng (tính toán là mean) là một chức năng một phần, nó không tạo ra một value cho tất cả các giá trị có thể ( collection có thể là trống rỗng, do đó không có cách nào để tính toán trung bình) và Option có thể là một case hợp lệ ở đây. Nếu bạn không thể tính toán mean bởi vì collection là sản phẩm nào chỉ trở lại một None. Nhưng có rất nhiều cách khác để giải quyết vấn đề này, bạn có thể sử dụng Either[L,R], với Left là kết quả của error và Right như là kết quả tốt, bạn vẫn có thể ném một exception và quấn nó bên trong một object Try (trong đó có vẻ phổ biến hơn hiện nay vì nó đã sử dụng PromiseFuture tính toán), bạn có thể sử dụng ScalaZ xác nhận nếu error đã là thực sự là một vấn đề xác nhận. Các khái niệm chính bạn nên có một đường dài từ phần này là error nên một phần của type trở lại của function và không phải một số ma thuật operation (ngoại lệ) mà không thể được tuyên bố hợp lý của các loại. Và như là một plug shameless, tôi đã blog về hoặc cố gắng ở đây .
–1 Phiếu
Đã trả lời 04/6/2016 bởi needstisue (1,060 điểm)
Nó sẽ dễ dàng hơn để trả lời câu hỏi này nếu bạn không yêu cầu "tại sao là Option tốt hơn so với trường hợp ngoại lệ?" và "tại sao là Option tốt hơn không?" và "tại sao là Option tốt hơn Try?" tất cả cùng một lúc. Câu trả lời cho lần đầu tiên trong những câu hỏi này là sử dụng ngoại lệ trong những tình huống không thực sự xuất sắc muddles control dòng chảy của các chương trình của bạn. Đây là nơi referential minh bạch đến-đó là dễ dàng hơn nhiều cho tôi (hoặc bạn) với lý do về code của bạn nếu tôi có thể suy nghĩ về giá trị và không cần phải theo dõi trường hợp ngoại lệ ở đâu được ném ra và bị bắt. Câu trả lời cho câu hỏi thứ hai (tại sao không null?) là một cái gì đó như "Bạn đã bao giờ có để đối phó với NullPointerException trong Java?". Đối với câu hỏi thứ ba, nói chung bạn đúng — nó là tốt hơn để sử dụng một type như Either[Throwable, A] hoặc Try[A] để đại diện cho tính toán có thể thất bại, vì chúng cho phép bạn để vượt qua cùng thông tin về sự thất bại nhiều hơn chi tiết. Trong một số trường hợp, Tuy nhiên, khi một function chỉ có thể thất bại một cách rõ ràng duy nhất, nó làm cho cảm giác sử dụng Option. Ví dụ, nếu tôi đang thực hiện một tra cứu trong một bản đồ, tôi có lẽ không thực sự cần hoặc muốn một cái gì đó giống như một Either[NoSuchElementException, A], nơi mà error là rất trừu tượng rằng tôi có lẽ sẽ kết thúc gói nó trong một cái gì đó thêm tên miền cụ thể nào. Vì vậy, get trên bản đồ chỉ trả về một Option[A].
Đã bình luận 04/6/2016 bởi Fcr_Dok (250 điểm)
Cuốn sách? Tôi không thấy làm thế nào ngoại lệ sẽ phá vỡ referential minh bạch. Ở Scala, 'Không có gì' là một type (mặc dù đặc biệt). Nếu function của bạn liên tục ném một exception khi một đối số liên tục nhất định, đó sẽ là minh bạch trong sự hiểu biết của tôi.
Đã bình luận 06/6/2016 bởi Adjectives (540 điểm)
: Cuốn sách là http://www.manning.com/bjarnason/ "ném và bắt các có nghĩa là chúng tôi có thể không còn lý do [...] bằng cách thay thế các điều khoản với định nghĩa của họ, nếu chúng tôi thay thế thay thế x trong x + y với ném Exception("fail!") mới + y, program của chúng tôi đã có một kết quả khác nhau "

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...