2015-09-21 19 views
8

Tôi đã một phương pháp để lưu thông tin của từng hoạt động thời gian:Catch và khai thác gỗ cho các hoạt động không liên quan

public void queueTimerInfo(long start, long end, String msg) { 
     try { 
      timer.queue(start, end, msg); 
     } catch (InterruptedException e) { 
      Logger.info(e.getMessage()); 
     } 
    } 

tôi gọi là phương pháp trên sau mỗi hoạt động. Điều quan trọng là bản thân hoạt động, trong khi thời gian chỉ là nhiệm vụ phụ. Đó là lý do tại sao tôi quyết định không làm bất cứ điều gì khi phương pháp thất bại, ngoại trừ việc đăng nhập nó.

Nhưng tôi luôn được thông báo rằng việc ghi nhật ký mà không quản lý ngoại lệ là một thực tiễn không tốt. Vì vậy, làm thế nào tôi nên viết lại mã trên?

+0

Nếu thao tác này không được phép làm gián đoạn các chức năng của mã, bạn sẽ làm gì? ném một ngoại lệ? – Stultuske

+3

thêm 'Thread.currentThread(). Interrupt();' vào cuối khối catch – Natalia

+0

Bạn chỉ cần không viết lại mã –

Trả lời

8

Nếu bạn biết hậu quả, tức là cuộc gọi timer.queue() có thể bị gián đoạn và không xếp hàng dữ liệu và bạn có thể sống với điều đó, thì bạn có thể bỏ qua Ngoại lệ. Như với hầu hết các quy tắc, bạn cần phải biết khi nào để phá vỡ chúng.

Tuy nhiên, tôi sẽ ghi lại quyết định của bạn bằng nhận xét trong khối catch, để bất cứ ai duy trì mã sau biết rằng không xử lý Ngoại lệ không phải là sự giám sát mà là quyết định có chủ ý.

0

Bạn có thể quấn và thử lại không? Và sau đó xử lý ngoại lệ phổ biến của bạn có thể chăm sóc đăng nhập và báo cáo. Và cung cấp ngữ cảnh với nó nếu có thể.

+0

Việc ghi thời gian qua hàng đợi sẽ không ảnh hưởng đến mã xung quanh, vì vậy hãy nghĩ lại là một lựa chọn tồi! –

5

Nhưng tôi đã luôn nói rằng cách đăng nhập mà không quản lý ngoại lệ là một thói quen xấu

không "quản lý" nghĩa là gì? Rethrowing chúng? Làm theo một cách mù quáng các bước 1, 2, 3 vì "zOMG một ngoại lệ đã bị ném! 111"?

Nếu bạn mù quáng làm theo các phương pháp hay nhất và các loại tư vấn khác bất kể bối cảnh của bạn, thì có thể bạn sẽ kết thúc với các quyết định thực sự có vấn đề và khó xử. Đừng làm những việc chỉ vì đó là cách thực hành tốt nhất. Thừa nhận các phương pháp hay nhất, nhưng đồng thời đảm bảo chúng thực sự có ý nghĩa trong hoàn cảnh của bạn.

Tự hỏi: ngoại lệ đó có tạo sự khác biệt không? Nó có phá vỡ hợp đồng không? Nó có thay đổi luồng ứng dụng của bạn không? Bạn có hoàn toàn không muốn điều đó xảy ra và nếu có, thì tình hình thực sự đặc biệt và bạn nên thực sự đối phó với nó bằng cách nào đó?

Nếu nó không tạo sự khác biệt, v.v. thì chỉ cần ghi nhật ký là hoàn toàn có thể chấp nhận được. Nó thực sự đi vào bối cảnh của bạn và tầm quan trọng của ngoại lệ của bạn.

LE: Tất nhiên, như Thomas gợi ý, bạn có thể muốn ghi lại quyết định của mình.

4

InterruptedException là đặc biệt vì nó không báo hiệu lỗi.

Khi phương thức khai báo InterruptedException, nó cho bạn biết rằng đó là phương pháp chặn có thể bị hủy bằng cách ngắt chuỗi của nó. Brian Goetz explains:

Khi một phương pháp ném InterruptedException, nó được nói với bạn rằng nếu thread thực hiện phương pháp này bị gián đoạn, nó sẽ làm cho một nỗ lực để ngăn chặn những gì nó đang làm và trở về sớm và chỉ ra nó trả lại sớm bằng cách ném InterruptedException.Ngăn chặn hoạt động tốt các phương pháp thư viện phải đáp ứng với sự gián đoạn và ném Ngắt gián đoạn để chúng có thể được sử dụng trong các hoạt động có thể hủy mà không ảnh hưởng đến phản hồi.

Bạn có nên

  • không bắt ngoại lệ và thêm một throws InterruptedException
  • bắt nó, dọn dẹp và rethrow nó
  • khi bạn không thể ném nó (ví dụ trong a Runnable) gọi Thread.getCurrentThread().interrupt();

Nếu bạn chỉ nuốt ngoại lệ, bạn sẽ thỏa hiệp phản hồi của bạn ứng dụng r.

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