2016-01-08 14 views
5

Tôi đang tạo một tiện ích dòng lệnh sẽ xóa các thư mục con/tệp. Nếu một tệp đang được sử dụng, thì System.IO.IOException sẽ bị ném. Tôi sử dụng một khối try-catch trong vòng lặp của tôi.Có thực hành không tốt để đặt một thử-Catch trong một vòng lặp?

Câu hỏi:

1. Có thực hành không tốt để thử bắt trong vòng lặp không?

2.Nếu có, lựa chọn nào tốt hơn?

Mã của tôi:

System.IO.DirectoryInfo di = new DirectoryInfo(path); 

    foreach (FileInfo file in di.GetFiles()) 
    { 
     try 
     { 
      file.Delete(); 
     } 
     catch(System.IO.IOException) 
     { 
      Console.WriteLine("Please Close the following File {0}", file.Name); 
     } 

    } 
+0

Thông báo giả định rằng lỗi là do tệp được mở. Điều gì nếu tập tin không thể bị xóa vì một số lý do khác? –

+0

@EricLippert - Tôi đã suy nghĩ chính xác điều đó, nhưng, tôi không chắc chắn về cách tiến hành. Làm thế nào bạn sẽ đi về xử lý nếu một tập tin không thể bị xóa vì lý do khác? –

+0

Trước hết, hãy quyết định xem có ai quan tâm không. Nếu không ai quan tâm, đừng căng thẳng về nó. Nếu ai đó quan tâm, điều tiếp theo cần làm là quyết định cách nói với họ. Giao diện điều khiển có thể là một cách tốt, có thể không. Khó nói mà không hiểu phần còn lại của chương trình. Điều tiếp theo cần làm là quyết định những gì để nói với họ. Nói cho họ biết sự thật: "không thể xóa tập tin blah.txt". Xem xét việc đưa ra thông báo từ ngoại lệ để thêm ngữ cảnh khác. Nhưng sự thật mà bạn biết ở đây là không thể xóa tệp, vì vậy hãy bắt đầu với điều đó. –

Trả lời

14

Không này có thể khá hữu ích. Ví dụ: Nếu bạn không muốn ngừng hoàn toàn vòng lặp nếu một Ngoại lệ bị ném hoặc nếu có thêm mã không nên chạy cho lần lặp hiện tại do Ngoại lệ, bạn có thể thực hiện một số việc như sau.

System.IO.DirectoryInfo di = new DirectoryInfo(path); 

foreach (FileInfo file in di.GetFiles()) 
{ 
    try 
    { 
     file.Delete(); 
    } 
    catch(System.IO.IOException) 
    { 
     Console.WriteLine("Please Close the following File {0}", file.Name); 
     continue; 
    } 
    // 
    // Other Code 
    // 
} 

Bằng cách này bạn có thể ghi lại lỗi để xem xét sau nhưng vẫn xử lý phần còn lại của những gì bạn đang cố xử lý.

+0

bạn cũng có thể sử dụng bắt này để làm một cái gì đó như xóa các tập tin trên khởi động lại. http://stackoverflow.com/questions/6077869/movefile-function-in-c-sharp-delete-file-after-reboot –

+0

@Mac - Rất cảm ơn mã và trả lời câu hỏi của tôi. –

+2

'tiếp tục' ở đây là thừa; bạn đã ở phần cuối của vòng lặp, do đó, 'tiếp tục' không bỏ qua bất kỳ thứ gì. – Servy

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