2012-01-05 35 views
5

Tiêu đề khá nhiều nói nhưng đây là một số nền:Thực hành không tốt là viết một phương thức không làm gì ngoại trừ việc ném một ngoại lệ?

Tôi có ứng dụng ASP.Net MVC nơi tôi cần kiểm tra danh sách đường dẫn tệp để tồn tại. Nếu bất kỳ đường dẫn nào không tồn tại thì một lỗi sẽ được trả về.

Hiện tại, tôi có bộ điều khiển cơ sở nơi sự kiện OnException được triển khai. Ở đây, bất kỳ ngoại lệ không được xử lý nào được xử lý và trang lỗi được trả lại cho người dùng bằng thông báo của ngoại lệ. Cách đơn giản nhất để tôi thực hiện kiểm tra ở trên là viết một phương thức kiểm tra từng đường dẫn để tồn tại và nếu bất kỳ đường dẫn nào bị lỗi, tôi chỉ cần ném (và đăng nhập) một ngoại lệ. Ngoại lệ này sau đó được xử lý bởi bộ điều khiển cơ sở và thông điệp thích hợp được trả về cho người dùng.

Vấn đề của tôi là làm điều này giống như thực hành không tốt. Tôi viết một phương thức trả về khoảng trống và mục đích duy nhất của nó là ném một ngoại lệ trong trường hợp hiếm hoi mà một trong các đường dẫn không tồn tại, trong hầu hết các trường hợp nó không làm gì cả. Đây có phải là một ý tưởng tồi không?

+2

Điều gì làm bạn nghĩ rằng điều đó sai? Đó là một thực tế phổ biến, thậm chí bạn có thể xem các ví dụ về nó trong mã nguồn .NET framework. –

+0

Tôi đoán nó chỉ cảm thấy sai. Nhưng thật tốt khi nhận được một số phản hồi rằng đây không phải là trường hợp. – zaq

Trả lời

8

Không có gì sai với điều đó.

Khuôn khổ .NET cũng thực hiện điều này: ví dụ: CancellationToken có phương thức ThrowIfCancellationRequested không có gì ngoài việc ném hoặc không ném tùy thuộc vào một số điều kiện.

Ví dụ khác: Dispatcher Phương thức VerifyAccess, kiểm tra xem người gọi có nằm trên cùng một luồng với điều khiển được cho phép truy cập và ném nếu không.

+0

Ok tốt để biết. Cảm ơn! – zaq

0

Trên .net tồn tại tùy chọn để thực hiện thao tác ném mới notimplementedexception, vì vậy bạn có thể tạo các phương thức và triển khai chúng sau này. Vì vậy, nó không phải là một thực tế xấu, thực hành xấu là để lại cho họ ở đó khi phát hành ứng dụng để sản xuất. Đưa ra lỗi không có lý do là thực hành không tốt.

Đối với TDD (phát triển theo hướng thử nghiệm) có thể rất hữu ích, bạn tạo phương pháp và sau đó kiểm tra đơn vị không thành công với ngoại lệ chưa được thực hiện và cuối cùng bạn triển khai phương pháp để vượt qua bài kiểm tra.

Btw đang trả lời tiêu đề câu hỏi của bạn, nhưng bạn nên đổi tên câu hỏi vì phương pháp của bạn làm điều gì đó. Nếu nó làm một cái gì đó và luôn luôn ném một ngoại lệ là thực hành xấu, trường hợp ngoại lệ là tốn kém, bạn nên đăng nhập lỗi và di chuyển trên, mà không có ngoại lệ. Bạn nên làm một hàm PathExists trả về một Boolean, đó là một giải pháp tốt hơn. (ngay cả khi ai đó bỏ phiếu cho tôi -1 vì không có lý do ... Heheh)

+0

Tôi đã cung cấp cho bạn +1 để khuyến khích bạn ở lại trang web, nhưng tôi cũng nghĩ đây không phải là câu trả lời hay: Tôi nghĩ rằng nó bỏ lỡ điểm của câu hỏi. Ví dụ của bạn với 'NotImplementedException' hoàn toàn khác. Ngoài ra, đoạn thứ ba của câu trả lời của bạn lại một chút không liên quan, và bạn nên đăng nó như một bình luận. –

+0

Phương pháp được đề cập không phải lúc nào cũng ném ngoại lệ, trên thực tế phần lớn các cuộc gọi sẽ không ném ngoại lệ.Một ngoại lệ chỉ được ném nếu một trong các đường dẫn không tồn tại, mà thông thường sẽ không xảy ra. Trả về boolean cũng có nghĩa là tôi mất thông tin về đường dẫn nào không hợp lệ. BTW, tôi đã không bỏ phiếu bạn xuống, lý luận của bạn cũng được giải thích và có ý nghĩa nhưng nó chỉ không hoàn toàn phù hợp cho tình hình của tôi. – zaq

+0

Sau đó, là công việc kinh doanh thông thường, nếu nó thất bại, nó sẽ ném một ngoại lệ, nếu không, nó chỉ trả về void. Vì vậy, sau đó không phải là một thực hành xấu ở tất cả, nó chỉ là một phương pháp void kiểm tra một cái gì đó. – H27studio

0

Một số người có thể nói rằng đó là một ý tưởng tồi nhưng đôi khi, không có sự thay thế lành mạnh. Nếu bạn muốn đưa ra một ngoại lệ để truyền đạt một lỗi trở lại cho một số người gọi, (có thể bị cô lập khỏi trình kích hoạt bằng mã của bên thứ ba đục), sau đó làm điều đó. Trọng tài cuối cùng - 'nó có hoạt động không?'

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