Đó không phải là khủng khiếp trong và của chính nó, nhưng người ta thực sự nên xem làm tổ.
Các trường hợp sử dụng chấp nhận được là như vậy:
Tôi là một thành phần thấp ish mà có thể gặp phải một số lỗi khác nhau tuy nhiên người tiêu dùng của tôi là chỉ quan tâm đến một loại hình cụ thể của ngoại lệ. Vì vậy, tôi có thể làm điều này:
catch(IOException ex)
{
throw new PlatformException("some additional context", ex);
}
Bây giờ điều này cho phép người tiêu dùng để làm:
try
{
component.TryThing();
}
catch(PlatformException ex)
{
// handle error
}
Vâng, tôi biết một số người sẽ nói nhưng người tiêu dùng nên bắt IOException nhưng điều này phụ thuộc vào cách trừu tượng mã tiêu thụ thực sự là. Điều gì sẽ xảy ra nếu Impl đang lưu một thứ gì đó vào đĩa và người tiêu dùng không có lý do hợp lệ nào để nghĩ rằng hoạt động của họ sẽ chạm vào đĩa? Trong một kịch bản như vậy nó sẽ làm cho không có ý nghĩa để đặt xử lý ngoại lệ này trong mã tiêu thụ.
Những gì chúng tôi thường cố tránh bằng cách sử dụng mẫu này là đặt trình xử lý ngoại lệ "bắt tất cả" vào mã logic nghiệp vụ bởi vì chúng tôi muốn tìm hiểu tất cả các loại ngoại lệ có thể. cần được điều tra. Nếu chúng tôi không phát hiện, nó sẽ phát sáng, chạm vào trình xử lý cấp "trên cùng" và sẽ tạm dừng ứng dụng để tiếp tục. Điều này có nghĩa là khách hàng sẽ báo cáo ngoại lệ đó và bạn sẽ có cơ hội xem xét nó. Điều này rất quan trọng khi bạn đang cố gắng xây dựng phần mềm mạnh mẽ. Bạn cần phải tìm tất cả các trường hợp lỗi này và viết mã cụ thể để xử lý chúng.
Điều gì không phải là rất đẹp là làm tổ một số tiền quá mức và đó là vấn đề bạn nên giải quyết với mã này.
Như một áp phích khác đã nêu ngoại lệ là hành vi ngoại lệ hợp lý nhưng không thực hiện quá xa. Về cơ bản mã nên thể hiện hoạt động "bình thường" và ngoại lệ nên xử lý các vấn đề tiềm năng mà bạn có thể gặp phải. Trong điều kiện ngoại lệ hiệu suất là tốt, bạn sẽ nhận được kết quả khủng khiếp nếu bạn perf thử nghiệm với một trình gỡ lỗi cho một thiết bị nhúng nhưng trong bản phát hành mà không có một trình gỡ lỗi chúng thực sự khá nhanh chóng.
Điều chính mọi người quên khi thảo luận về hiệu suất của ngoại lệ là trong trường hợp lỗi mọi thứ đều chậm lại vì người dùng đã gặp sự cố. Chúng ta có thực sự quan tâm đến tốc độ khi mạng bị ngắt và người dùng không thể lưu công việc của họ không? Tôi rất nghi ngờ nhận được báo cáo lỗi trở lại cho người dùng một vài ms nhanh hơn sẽ tạo sự khác biệt.
Hướng dẫn chính cần nhớ khi thảo luận ngoại lệ là Ngoại lệ không được xảy ra trong luồng ứng dụng thông thường (thường không có lỗi). Mọi thứ khác bắt nguồn từ tuyên bố đó.
Trong ví dụ chính xác bạn cho là tôi không chắc chắn. Dường như với tôi rằng không có lợi ích nào thực sự thu được từ việc gói những gì có vẻ là một ngoại lệ tcl chung trong một ngoại lệ tcl âm thanh chung chung khác. Nếu bất cứ điều gì tôi sẽ đề nghị theo dõi xuống các tác giả ban đầu của mã và tìm hiểu xem có bất kỳ logic cụ thể đằng sau suy nghĩ của mình. Rất có thể là mặc dù bạn chỉ có thể giết bắt.
Khối catch được hiển thị ở đây sẽ thêm thông tin bổ sung vào đối tượng ngoại lệ, điều này có thể biện minh cho sự hiện diện của nó. Nhưng nếu khối catch là vô dụng, loại bỏ nó. – Qwertie