Điều này là cách thích hợp để xử lý ngoại lệ!
Nói chung, không nên xử lý ngoại lệ trừ khi vấn đề có thể được sửa chữa và chỉ được xử lý ở nơi có thể áp dụng hiệu chỉnh.
Ví dụ: người gọi mã của bạn có thể muốn nhắc người dùng sửa địa chỉ email xấu. Nhưng mã của bạn không thể biết đúng cách để nhắc. Bạn đang được gọi từ WinForms hoặc Web Forms? Hộp thoại sẽ trông như thế nào? Nên có ngay cả là một hộp thoại không? Đây là những thứ chỉ có thể được người gọi của phương thức của bạn biết, chứ không phải bởi chính phương thức của bạn.
Trong người gọi:
try
{
SendEmail(SenderEmail, SenderDisplayName, RecipientEmails, Subject, Message);
}
catch (MyMailAddressException ex)
{
MessageBox.Show(ex.Message);
}
Lưu ý rằng bất kỳ trường hợp ngoại lệ khác hơn MyMailAddressException
sẽ tuyên truyền để mã mà biết làm thế nào để xử lý chúng.
mức phù hợp của "xử lý" trong phương pháp của bạn:
public enum MailAddressType
{
Sender,
Recipient
}
public class MyMailAddressException : Exception
{
public MailAddressType AddressType { get; set; }
public string EmailAddress { get; set; }
public MyMailAddressException(
string message,
MailAddressType addressType,
string emailAddress,
Exception innerException) : base(message, innerException)
{
AddressType = addressType;
EmailAddress = emailAddress;
}
}
public void SendEmail(
string senderEmail,
string senderDisplayName,
IEnumerable<string> recipientEmails,
string subject,
string message)
{
using (
var mailMessage = new MailMessage
{
Subject = subject,
Body = message
})
{
try
{
mailMessage.From = new MailAddress(
senderEmail, senderDisplayName);
}
catch (FormatException ex)
{
throw new MyMailAddressException(
"Invalid from address", MailAddressType.Sender,
senderEmail, ex);
}
foreach (var recipient in recipientEmails)
{
try
{
mailMessage.To.Add(recipient);
}
catch (FormatException ex)
{
throw new MyMailAddressException(
"Invalid to address", MailAddressType.Recipient,
recipient, ex);
}
}
var smtpClient = new SmtpClient("192.168.168.182");
smtpClient.Send(mailMessage);
}
}
Người gọi sau đó có thể bắt MyMailAddressException
và có tất cả các thông tin cần thiết để nói cho người dùng những gì để sửa chữa. Các trường hợp ngoại lệ khác cần được phổ biến.
Chỉnh sửa trước đó của tôi đã giải quyết câu hỏi của bạn về phương pháp. Tôi đã giả định rằng ứng dụng của bạn có xử lý ngoại lệ cấp cao thích hợp. Gabriel chỉ ra rằng nếu bạn có xử lý ngoại lệ cấp cao thích hợp thì ứng dụng của bạn sẽ không bị lỗi!
Tuy nhiên, sự cố không nhất thiết phải là điều xấu. Nếu một cái gì đó xảy ra mà mã của bạn không thể xử lý, sau đó crashing là điều phải làm. Cách khác là cố gắng tiếp tục chạy, hy vọng rằng ngoại lệ không được giải quyết này đã không làm hỏng chương trình của bạn theo cách mà nó bắt đầu tạo ra kết quả không chính xác.
Chi tiết cụ thể về vị trí đặt "trình xử lý cấp cao nhất" phụ thuộc vào chương trình của bạn. Nó khác nhau giữa các ứng dụng WinForms và ASP.NET, ví dụ. Tuy nhiên, khái niệm sẽ giống nhau: an toàn đăng nhập tất cả các thông tin có sẵn, sau đó cho phép ngoại lệ truyền, làm hỏng ứng dụng.
Tất nhiên, bạn nên sử dụng finally
khối để xóa ứng dụng của mình, ngay cả khi có ngoại lệ.
Không, tôi không bỏ qua nó. Bạn có thấy nơi tôi nói về việc nhắc người dùng sửa địa chỉ email không hợp lệ không? Đó là xử lý ngoại lệ. –
Không, vì đây là phương thức tiện ích cấp dưới, ngoại lệ nhất định nên được xử lý ở đây. Để nó cho người gọi. –
@Jon: Không, đoạn giữa của anh ấy tóm tắt hoàn toàn cách ngoại lệ được sử dụng: iff vấn đề có thể được giải quyết. –