Tôi không tin rằng sản phẩm khai thác tại địa phương là một mô hình chống, trên thực tế nếu tôi nhớ chính xác thì nó thực sự được thi hành trong Java!
Chìa khóa cho tôi khi thực hiện xử lý lỗi là chiến lược tổng thể. Bạn có thể muốn một bộ lọc nắm bắt tất cả các ngoại lệ ở ranh giới dịch vụ, bạn có thể muốn chặn chúng theo cách thủ công - cả hai đều ổn miễn là có một chiến lược tổng thể, sẽ rơi vào các tiêu chuẩn mã hóa của nhóm của bạn.
Cá nhân tôi thích bắt lỗi bên trong một chức năng khi tôi có thể thực hiện một trong những điều sau đây:
- Thêm thông tin theo ngữ cảnh (chẳng hạn như trạng thái của các đối tượng hoặc những gì đang diễn ra)
- Xử lý ngoại lệ một cách an toàn (như phương pháp TryX)
- Hệ thống của bạn đang vượt qua một ranh giới dịch vụ và gọi vào một thư viện hoặc API bên ngoài
- Bạn muốn bắt và suy nghĩ lại một loại ngoại lệ khác (có thể với nguyên bản là ngoại lệ bên trong)
- Ngoại lệ được đưa ra như một phần của một số chức năng nền có giá trị thấp
Nếu đó không phải là một trong những trường hợp này thì tôi không thêm thử / bắt cục bộ. Nếu đúng, tùy thuộc vào kịch bản, tôi có thể xử lý ngoại lệ (ví dụ: phương thức TryX trả về sai) hoặc suy nghĩ lại để ngoại lệ sẽ được xử lý bởi chiến lược toàn cầu.
Ví dụ:
public bool TryConnectToDatabase()
{
try
{
this.ConnectToDatabase(_databaseType); // this method will throw if it fails to connect
return true;
}
catch(Exception ex)
{
this.Logger.Error(ex, "There was an error connecting to the database, the databaseType was {0}", _databaseType);
return false;
}
}
Hoặc một ví dụ về suy nghĩ lại:
public IDbConnection ConnectToDatabase()
{
try
{
// connect to the database and return the connection, will throw if the connection cannot be made
}
catch(Exception ex)
{
this.Logger.Error(ex, "There was an error connecting to the database, the databaseType was {0}", _databaseType);
throw;
}
}
Sau đó, bạn bắt lỗi ở đầu ngăn xếp và đưa ra một thông báo thân thiện với người dùng.
Bất kỳ cách tiếp cận nào bạn thực hiện luôn luôn đáng để tạo các thử nghiệm đơn vị cho các tình huống này để bạn có thể đảm bảo chức năng không thay đổi và làm gián đoạn dòng chảy của dự án vào một ngày sau đó.
Bạn đã không đề cập đến ngôn ngữ nào bạn đang làm việc nhưng là một nhà phát triển .NET và đã thấy điều này quá nhiều lần không đề cập đến nó.
ĐỪNG VIẾT:
catch(Exception ex)
{
throw ex;
}
Sử dụng:
catch(Exception ex)
{
throw;
}
Cái trước đặt lại dấu vết ngăn xếp và làm cho cấp cao nhất của bạn bắt hoàn toàn vô dụng!
TLD
Bắt cục bộ không phải là một mô hình chống, nó thường có thể là một phần của thiết kế và có thể giúp thêm bối cảnh bổ sung cho lỗi.