2008-10-24 63 views
6

Tôi có một số mã bỏ qua một ngoại lệ cụ thể.Bỏ qua ngoại lệ

try 
{ 
    foreach (FileInfo fi in di.GetFiles()) 
    { 
     collection.Add(fi.Name); 
    } 
    foreach (DirectoryInfo d in di.GetDirectories()) 
    { 
     populateItems(collection, d); 
    } 
} 
catch (UnauthorizedAccessException ex) 
{ 
    //ignore and move onto next directory 
} 

tất nhiên kết quả này trong một cảnh báo thời gian biên dịch như cũ không được sử dụng. Có một số tiêu chuẩn chấp nhận noop mà nên được sử dụng để loại bỏ cảnh báo này?

Trả lời

12

Chỉ cần viết lại nó như

catch (UnauthorizedAccessException) {} 
+0

Tôi không có ý tưởng cho phép, tiện lợi, cảm ơn. – stimms

+0

Nhưng vui lòng vẫn bao gồm nhận xét!Chỉ một khối hoàn toàn trống trong mã sản xuất không được chuyển qua đánh giá mã IMO. –

+0

> "Nhưng vui lòng vẫn bao gồm nhận xét ,,,". Không đồng ý với điều này. "catch (SomeException) {}" đã nói rõ ràng "bỏ qua SomeException" và trong nhiều trường hợp nhận xét bổ sung sẽ không cần thiết. – Joe

1

Tôi thường làm

Debug.WriteLine(ex.message) 

(cách mà tôi chỉ có thể thiết lập một breakpoint trong ngoại lệ, nếu cần thiết, quá)

2

Theo Dave M và tvanfosson đã nói, bạn muốn viết lại nó dưới dạng

catch (UnauthorizedAccessException) {} 

Câu hỏi lớn hơn mà nên được hỏi, tuy nhiên, là lý do tại sao bạn đang bắt một ngoại lệ trên bỏ qua nó (thường được gọi là nuốt ngoại lệ)? Đây thường là một ý tưởng tồi vì nó có thể (và thường làm) ẩn các vấn đề trong ứng dụng trong thời gian chạy có thể dẫn đến kết quả rất lạ và một thời gian khó gỡ lỗi chúng.

+0

Ít nhất nó tốt hơn "catch (Exception) {}". – MusiGenesis

+0

Đúng, nhưng chỉ tốt hơn một chút. –

+0

Tôi nghĩ đôi khi bạn có thể bắt được một ngoại lệ và nuốt nó nhưng luôn có một bình luận giải thích lý do tại sao bạn làm điều đó. –

-1

Mặc dù tôi là nhà phát triển Java (không phải C#), @Scott Dorman hoàn toàn đúng. Tại sao bạn "nuốt ngoại lệ"? Tốt hơn, những gì có thể ném UnauthorizedAccessException? Dưới đây là khả năng chung cảm giác:

  1. Các tập tin không tồn tại
  2. Thư mục không tồn tại
  3. Các chủ đề hiện hành của kiểm soát không có đặc quyền bảo mật chính xác. Trong thế giới * nix, luồng hiện tại có thể nằm trong nhóm sai hoặc người dùng sai.
  4. Đĩa bị rơi
  5. ACL của tệp được đặt thành chỉ viết nhưng không đọc. Tương tự như vậy, đối với thư mục.

Danh sách trên đây là danh sách không đầy đủ.

+0

Ba trong số những khả năng thông thường đó sẽ không ném ra một UnauthorizedAccessException. Và hai phương pháp khác chính xác là lý do tại sao phương thức này lại nuốt ngoại lệ: nó chỉ muốn các tệp được phép truy cập. –

1

Giả sử các bình luận trong mã ban đầu của bạn là một mô tả chính xác những gì bạn đang cố gắng để làm, tôi nghĩ rằng bạn muốn viết nó như thế này:

foreach (FileInfo fi in di.GetFiles()) 
{ 
    //TODO: what exceptions should be handled here? 
    collection.Add(fi.Name); 
} 

// populate collection for each directory we have authorized access to 
foreach (DirectoryInfo d in di.GetDirectories()) 
{ 
    try 
    { 
     populateItems(collection, d); 
    } 
    catch (UnauthorizedAccessException) 
    { 
     //ignore and move onto next directory 
    } 
} 

Và sau đó bạn cần phải làm việc trên TODO rằng mục.

+0

Mục TODO rất dễ - gần như chắc chắn bạn không muốn xử lý bất kỳ ngoại lệ nào ở đó. – Joe

+0

Có lẽ bạn đang đúng. Nhưng tôi sẽ không đoán xem tấm áp phích ban đầu có ý định làm gì, và trong một bài đánh giá mã, tôi sẽ nói với anh ấy. –

1

Tôi đồng ý với những người nói rằng có thể là một ý tưởng tồi khi bỏ qua ngoại lệ. Nếu bạn không định ném lại thì ít nhất hãy đăng nhập nó ở đâu đó. Tôi đã viết các công cụ nhỏ xử lý danh sách các tệp mà tôi không muốn lỗi trên các tệp riêng lẻ làm hỏng toàn bộ chương trình và trong trường hợp này tôi sẽ in thông báo cảnh báo để tôi có thể xem tệp nào bị bỏ qua.

Thời gian duy nhất cá nhân tôi bắt được ngoại lệ mà không đặt tên nó, như trong catch (xxxException), là nếu tôi sẽ phản ứng với nó theo một cách nào đó và sau đó ném lại để tôi có thể bắt nó một số thói quen bên ngoài. Ví dụ:

try 
{ 
    // do something 
    // ... 
} 
catch(UnauthorizedAccessException) 
{ 
    // react to this exception in some way 
    // ... 

    // let _someone_ know the exception happened 
    throw; 
} 
Các vấn đề liên quan