Bạn hầu như không bao giờ nên dùng thử/nắm bắt.
Bạn chỉ nên catch
ngoại lệ mà bạn thực sự có thể sửa và chỉ khi bạn đang mong đợi. Nếu không, hãy để người gọi xử lý ngoại lệ - hay không.
Nếu được sử dụng, bất kỳ mệnh đề catch
nào được thực hiện trước tiên - chỉ một trong số chúng.
Sau đó, finally
được "thực thi" cuối cùng.
Điều này đã được nêu rõ hơn ở nhiều nơi, nhưng tôi sẽ thử. Mã sau:
try
{
// Do something here
}
catch (Exception ex)
{
MessageBox.Show("Friendly error message");
}
không khắc phục ngoại lệ. Nó ẩn ngoại lệ để vấn đề sẽ không bao giờ được sửa. Mã đó không có ý tưởng ngoại lệ được ném ra, bởi vì nó sẽ bắt tất cả chúng, và nó không có gì để sửa vấn đề - nó chỉ nói cho người dùng một tiểu thuyết lịch sự.
Thực tế của vấn đề là các mã trên nên được thay thế bằng những điều sau đây:
// Do something here
Bằng cách này, nếu người gọi của phương pháp này biết làm thế nào để khắc phục vấn đề đặc biệt, sau đó người gọi có thể khắc phục chúng . Bạn sẽ không xóa tùy chọn đó khỏi người gọi.
Nếu người gọi không biết cách khắc phục sự cố, thì người gọi cũng không nên bắt ngoại lệ.
Đây là ví dụ (từ MSDN) về sử dụng ngoại lệ một cách hợp lý. Đó là một dạng sửa đổi của ví dụ trong tài liệu của SmtpFailedRecipientsException Class.
public static void RetryIfBusy(string server)
{
MailAddress from = new MailAddress("[email protected]");
MailAddress to = new MailAddress("[email protected]");
using (
MailMessage message = new MailMessage(from, to)
{
Subject = "Using the SmtpClient class.",
Body =
@"Using this feature, you can send an e-mail message from an application very easily."
})
{
message.CC.Add(new MailAddress("[email protected]"));
using (SmtpClient client = new SmtpClient(server) {Credentials = CredentialCache.DefaultNetworkCredentials})
{
Console.WriteLine("Sending an e-mail message to {0} using the SMTP host {1}.", to.Address, client.Host);
try
{
client.Send(message);
}
catch (SmtpFailedRecipientsException ex)
{
foreach (var t in ex.InnerExceptions)
{
var status = t.StatusCode;
if (status == SmtpStatusCode.MailboxBusy || status == SmtpStatusCode.MailboxUnavailable)
{
Console.WriteLine("Delivery failed - retrying in 5 seconds.");
System.Threading.Thread.Sleep(5000); // Use better retry logic than this!
client.Send(message);
}
else
{
Console.WriteLine("Failed to deliver message to {0}", t.FailedRecipient);
// Do something better to log the exception
}
}
}
catch (SmtpException ex)
{
// Here, if you know what to do about particular SMTP status codes,
// you can look in ex.StatusCode to decide how to handle this exception
// Otherwise, in here, you at least know there was an email problem
}
// Note that no other, less specific exceptions are caught here, since we don't know
// what do do about them
}
}
}
Lưu ý rằng mã này sử dụng try/catch để bao quanh một đoạn mã nhỏ. Trong khối try/catch đó, nếu một SmtpException hoặc SmtpFailedRecipientsException được ném ra, chúng ta biết phải làm gì với nó. Ví dụ, nếu chúng ta bắt được IOException
, chúng ta sẽ không biết nó có ý nghĩa gì, hoặc phải làm gì với nó. Bất kỳ trường hợp ngoại lệ nào bạn không thực sự biết cách sửa lỗi sẽ không bị bắt, ngoại trừ có thể thêm thông tin vào ngoại lệ, đăng nhập và truy cập lại.
Hãy học cách sử dụng dấu chấm ('.') và dấu hỏi ('?') một cách thích hợp. Tôi không thể hiểu được câu hỏi của bạn vì nó hiện đang đứng. – BoltClock