2011-01-12 25 views
17

Xử lý lỗi cũ có xu hướng tuân theo phương thức mà tất cả các hàm trả về mã tùy thuộc vào thành công/thất bại. Bạn sẽ kiểm tra mã này và xử lý (nếu có lỗi) một cách thích hợp.Tại sao nên ném ngoại lệ hơn là trả lại mã lỗi?

Ngôn ngữ lập trình hiện đại tuy nhiên theo mô hình ngoại lệ, nếu có điều gì đó đặc biệt xảy ra không thể xử lý đúng cách ngoại lệ.

Câu hỏi của tôi là tại sao chúng tôi chuyển sang mô hình ngoại lệ? Lý do đằng sau điều này là gì? Tại sao nó tốt hơn?

Giải thích/liên kết sẽ được đánh giá cao.

Trả lời

20

Tôi đã viết về vấn đề này tại chiều dài: Exceptions vs. status returns, nhưng một thời gian ngắn:

  1. Exceptions lá mã của bạn sạch sẽ của tất cả các kiểm tra cần thiết khi kiểm tra tình trạng lợi nhuận trên mỗi cuộc gọi,
  2. Exceptions cho phép bạn sử dụng giá trị trả lại của hàm cho giá trị thực tế,
  3. Ngoại lệ có thể mang nhiều thông tin hơn mức trả về trạng thái,
  4. Quan trọng nhất: ngoại lệ không thể bỏ qua thông qua hoạt động, trong khi trả về trạng thái có thể.

Để mở rộng điểm cuối cùng: nếu bạn quên làm những gì bạn nên làm với trả về trạng thái, bạn bỏ qua lỗi. Nếu bạn quên làm những gì bạn nên làm với ngoại lệ, ngoại lệ sẽ bong bóng lên lớp ngoài của phần mềm nơi nó sẽ hiển thị.

+1

bạn không bỏ danh sách thực tế là sử dụng ngoại lệ cho phép thử/nắm bắt (MyCustomException ex) để bạn/(các nhà phát triển khác) có thể thêm try/catches sẽ chỉ bắt được loại ngoại lệ mới tạo. –

+0

Đó là một điểm tuyệt vời. Tôi thích rằng các lớp có thể bỏ qua các ngoại lệ và cho phép chúng đi qua. Điểm của bạn là có thể được phân loại theo từng loại ngoại lệ (giả sử bạn đang sử dụng một ngôn ngữ hỗ trợ bắt ngoại lệ theo loại của chúng). –

9

Dưới đây là một vài lý do

  • Bỏ qua một ngoại lệ đòi hỏi hành động của các nhà phát triển trong khi bỏ qua một giá trị trở xấu đòi hỏi chính xác 0 action. Điều này, về lý thuyết, làm cho nó nhiều khả năng một nhà phát triển sẽ xử lý một lỗi so với bỏ qua nó hoặc thậm chí không nhận ra nó đã xảy ra.
  • Cung cấp sự tách biệt rõ hơn giữa điểm lỗi và cách xử lý. Nó không bắt buộc việc truyền dẫn thủ công lỗi ở mọi điểm ở giữa.
  • Trường hợp ngoại lệ có thể tải trọng thông tin lớn hơn và phong phú hơn so với mã lỗi đơn giản. Có nhiều cách để làm điều này với mã lỗi nhưng nó nhiều hơn một suy nghĩ và là một chút cồng kềnh.
2

Mã trạng thái thường tốt hơn ngoại lệ trong trường hợp chúng đại diện cho các trường hợp mã gọi ngay lập tức của hàm được chuẩn bị để xử lý. Vấn đề với mã trạng thái là nếu mã gọi ngay lập tức không xử lý chúng, nó có khả năng sẽ không có gì. Nếu mã ném một ngoại lệ và mã gọi ngay lập tức không được chuẩn bị để xử lý nó, ngoại lệ sẽ lan truyền đến mã mà ít nhất các yêu cầu được chuẩn bị như vậy.

Các vấn đề liên quan