Theo tôi, ngoại lệ là một công cụ thiết yếu để phát hiện lỗi mã trong thời gian chạy. Cả trong thử nghiệm và trong sản xuất. Làm cho thông điệp của họ đủ dài để kết hợp với dấu vết ngăn xếp, bạn có thể tìm ra điều gì đã xảy ra từ nhật ký.
Các ngoại lệ chủ yếu là một công cụ phát triển và một cách để có được các báo cáo lỗi hợp lý từ sản xuất trong các trường hợp không mong muốn.
Ngoài việc phân tách các mối quan tâm (đường dẫn hạnh phúc chỉ có lỗi dự kiến so với rơi vào cho đến khi gặp một số trình xử lý chung cho các lỗi không mong muốn) là một điều tốt, làm cho mã của bạn dễ đọc và dễ bảo trì hơn, thực tế không thể chuẩn bị mã của bạn cho tất cả có thể trường hợp bất ngờ, thậm chí bằng cách làm đầy nó với mã xử lý lỗi để hoàn thành không thể đọc được.
Đó thực sự là ý nghĩa của "bất ngờ".
Btw., Những gì được mong đợi và những gì không phải là một quyết định chỉ có thể được đưa ra tại trang web cuộc gọi. Đó là lý do tại sao các ngoại lệ được kiểm tra trong Java không giải quyết được - quyết định được đưa ra tại thời điểm phát triển API, khi nó không rõ ràng những gì được mong đợi hoặc bất ngờ.
Ví dụ đơn giản: API của bản đồ băm có thể có hai phương thức:
Value get(Key)
và
Option<Value> getOption(key)
lần đầu tiên ném một ngoại lệ nếu không tìm thấy, lần sau cung cấp cho bạn một giá trị tùy chọn. Trong một số trường hợp, cái sau có ý nghĩa hơn, nhưng trong những trường hợp khác, mã sin của bạn phải hy vọng có một giá trị cho một khóa đã cho, vì vậy nếu không có, đó là lỗi mà mã này không thể sửa được vì lỗi cơ bản giả định đã thất bại. Trong trường hợp này, đó thực sự là hành vi mong muốn thoát khỏi đường dẫn mã và xuống một số trình xử lý chung trong trường hợp cuộc gọi thất bại.
Mã không bao giờ nên cố gắng đối phó với các giả định cơ bản thất bại.
Ngoại trừ bằng cách kiểm tra chúng và ném các ngoại lệ dễ đọc, tất nhiên.
Ném ngoại lệ không phải là xấu nhưng bắt chúng có thể. Đừng cố gắng sửa các lỗi không mong muốn. Bắt ngoại lệ ở một vài nơi mà bạn muốn tiếp tục một số vòng lặp hoặc hoạt động, ghi nhật ký chúng, có thể báo cáo một lỗi không xác định và đó là lỗi.
Bắt các khối ở khắp nơi là một ý tưởng rất xấu.
Thiết kế API của bạn theo cách giúp bạn dễ dàng thể hiện ý định của mình, tức là tuyên bố xem bạn có mong đợi một trường hợp nào đó, như không tìm thấy khóa hay không. Người dùng API của bạn sau đó có thể chọn cuộc gọi ném cho những trường hợp thực sự bất ngờ.
Tôi đoán rằng lý do mà mọi người phẫn nộ ngoại lệ và đi quá xa bằng cách bỏ qua công cụ quan trọng này để tự động hóa xử lý lỗi và phân tách mối quan tâm tốt hơn khỏi các ngôn ngữ mới là những trải nghiệm tồi tệ.
Điều đó, và một số hiểu lầm về những gì họ thực sự tốt cho.
Mô phỏng chúng bằng cách thực hiện MỌI THỨ thông qua liên kết đơn âm làm cho mã của bạn không thể đọc và duy trì được, và bạn kết thúc mà không có dấu vết ngăn xếp, điều này làm cho cách tiếp cận này tồi tệ hơn.
Xử lý lỗi kiểu chức năng là tuyệt vời cho các trường hợp lỗi dự kiến.
Hãy để việc xử lý ngoại lệ tự động xử lý tất cả phần còn lại, đó là những gì dành cho :)
panic
cái không hoàn toàn giống nhau. Ngoài những gì được nói ở đó, một ngoại lệ không khác gì một cách tinh vi (nhưng thoải mái) để thực hiện aGOTO
, mặc dù không ai gọi nó theo cách đó, vì những lý do rõ ràng.