2015-10-15 19 views
9

Bạn có thể học một lớp học với các phương pháp ngắn để bắt ngoại lệ không?Các lớp học được sử dụng để quản lý ngoại lệ

class ContractUtils{ 
    public static String getCode(Contract contract) throws MyException{ 
    try{ 
     return contract.getInfo().getCode(); //throws ContractException and LogicException 
    }catch(Exception e){ 
     throw new MyException("error during code reading:"+e.getMessage, e); 
    } 
    } 
    //other methods like above... 
} 
+4

Đừng quên viết "ném" vào chữ ký của phương thức –

+1

Ehhhh. Các trường hợp ngoại lệ phải được xử lý ngay sau khi bạn có thể trả lời chúng một cách hữu ích. Nói chung không có xu hướng ở một số phương thức tiện ích ngẫu nhiên, nhưng thấp hơn (trong 'contract.getInfo(). GetCode()') hoặc cao hơn (ở cấp ứng dụng nơi bạn có thể tạo ra một thông báo lỗi hữu ích). –

+1

Điều gì xảy ra nếu 'contract.getInfo(). GetCode()' ném ví dụ: 'NullPointerException' hoặc' ArithmeticException'? Chắc chắn trong những tình huống này, bạn sẽ không muốn bắt và ném 'MyException' thay thế? –

Trả lời

2

lớp tiện ích của bạn ContractUtil giới thiệu một mức độ gián tiếp chỉ để dịch các ngoại lệ ban đầu vào ngoại lệ khác:

Thay vì các cuộc gọi trực tiếp:

return contract.getInfo().getCode() 

bây giờ bạn đang viết càng nhân tạo

return ContractUtils.getCode(contract); 

Nhưng có thể có những tình huống mà giải pháp này có thể được biện minh , ví dụ .:

Bạn đang không được phép ném ContractException hoặc LogicException, và bạn đang gọi phương pháp này rất nhiều lần.

Nhưng nếu bạn có thể thay đổi chữ ký, tốt hơn hết là thiết kế lại phương thức gốc để chỉ ném MyException.

+0

nó không được gọi là rất thường xuyên nhưng tôi phải sử dụng nó nhiều lần vì vậy tôi nghĩ rằng để sử dụng một phương pháp duy nhất để quản lý ngoại lệ một lần và luôn luôn nhận được cùng một thông báo lỗi – Lemmy4555

+1

@ user1951947 sau đó nó sẽ không được tốt hơn để di chuyển thông báo lỗi này bình thường hóa vào phương pháp? Và như tôi đã nói nếu đây không phải là một lựa chọn thì giải pháp của bạn có vẻ ổn với tôi. – wero

0

Luôn luôn nắm bắt và xử lý ngoại lệ riêng biệt trong mã của bạn. Chỉ định một ngoại lệ tùy chỉnh chung không được khuyến nghị.

Tham khảo link này để thực hành tốt nhất trong việc quản lý hợp ngoại lệ:

https://softwareengineering.stackexchange.com/questions/209693/best-practices-to-create-error-codes-pattern-for-an-enterprise-project-in-c

+0

OP không bao giờ nêu rõ những ngoại lệ đó được quản lý như thế nào. Hầu như mọi thư viện COTS và OSS đều tạo ra các ngoại lệ tùy chỉnh. Ngoài ra, bạn liên kết với một câu trả lời đã được tìm thấy là quá rộng bởi cộng đồng người dùng SO. – Keith

3

Nếu một ngoại lệ tùy chỉnh cung cấp thêm ngữ cảnh hoặc giá trị cho mã gọi, thì đó là hữu ích và khuyến khích để tạo ra chúng.

Bạn đang sử dụng phương pháp tĩnh hoàn toàn có thể chấp nhận được. Dưới đây là một trường hợp sử dụng tốt SO answer xác định các phương pháp tĩnh ngắn.

1

Có thể hữu ích khi tách logic ứng dụng khỏi xử lý lỗi để dễ đọc.

Nhưng không phải trong lớp tiện ích vì bạn có thể quên sử dụng nó, và hoàn thành nhiệm vụ của mình trực tiếp và vẫn mong đợi một ngoại lệ tùy chỉnh. Tôi sẽ đặt logic này trong lớp Contact nếu nó được sử dụng thường xuyên (và làm cho Contract.getInfo() riêng). Một nhược điểm nữa là, nó có thể dẫn đến các lớp tiện ích quá thông thái (LoD - https://en.wikipedia.org/wiki/Law_of_Demeter) về các chi tiết thực hiện của các lớp khác, có thể phá vỡ đóng gói và làm cho chúng ít được bảo trì hơn do phụ thuộc cao hơn.

Và bạn có thể muốn có ngoại lệ cụ thể.

+0

Vâng, tôi đồng ý với bạn rằng điều này nên được thực hiện vào lớp Hợp đồng, tiếc là nó trở thành vì nó là từ một diễn viên bên ngoài và tùy chọn để thay đổi nó là không thể, sau đó tôi quyết định viết một loại "proxy" cho lớp hợp đồng. – Lemmy4555

+1

Tôi thấy, bạn có thể bọc nó bằng cách sử dụng bố cục, nếu nó không quá lớn. –

+0

Vâng, nó có thể là một giải pháp tốt cũng để bọc nó và ghi đè lên các phương pháp tôi phải gọi, tôi thích nó. – Lemmy4555

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