Thực tiễn tốt nhất để xử lý ngoại lệ trong NHibernate là gì?Xử lý ngoại lệ NHibernate
Tôi đã có một SubjectRepository như sau:
public void Add(Subject subject)
{
using (ISession session = HibernateUtil.CurrentSession)
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(subject);
transaction.Commit();
}
}
Và một thử nghiệm đơn vị như sau:
[Test]
public void TestSaveDuplicate()
{
var subject = new Subject
{
Code = "En",
Name = "English"
};
_subjectRepository.Add(subject);
var duplicateSubject = new Subject
{
Code = "En",
Name = "English1"
};
_subjectRepository.Add(duplicateSubject);
}
tôi đến điểm xử lý các lỗi được tạo ra bởi các đơn vị kiểm tra và có một chút khó khăn. Điều này không thành công như mong đợi, mặc dù với một GenericADOException, tôi đã mong đợi một ConstraintViolationException hoặc một cái gì đó tương tự (có một ràng buộc duy nhất trên mã chủ đề ở cấp cơ sở dữ liệu).
ADOException bao bọc một ngoại lệ MySQL có thông báo lỗi hợp lý nhưng tôi không muốn bắt đầu phá vỡ đóng gói bằng cách chỉ ném ngoại lệ bên trong. Đặc biệt là MySQL không được hoàn thành như là kết thúc trở lại cho dự án này.
Lý tưởng nhất là tôi muốn có thể nắm bắt ngoại lệ và trả lại lỗi hợp lý cho người dùng tại thời điểm này. Có cách tiếp cận thực hành tốt nhất để xử lý các ngoại lệ NHibernate và báo cáo lại cho người dùng những gì đã xảy ra không và tại sao?
Cảm ơn,
Matt
Tôi nghĩ rằng việc bao gồm ngoại lệ cũng là tùy chọn tốt nhất. Ngoại lệ bên trong là một cái gì đó dọc theo dòng của MySQLException Message = "Mục nhập trùng lặp 'En' cho khóa 3". Vì điều này sẽ được gọi trực tiếp bởi giao diện người dùng, tôi muốn trả lại một thông điệp có ý nghĩa. –
Đây có phải là ý tưởng hay, để bắt TẤT CẢ ngoại lệ và quấn nó? – VikciaR
Bạn có thể loại bỏ hầu hết mã này, nếu bạn chỉ cần sửa lại ngoại lệ - nếu giao dịch không được cam kết rõ ràng, nó sẽ được cuộn lại khi phiên đóng (hoặc rõ ràng nếu lệnh gọi cam kết đang ném ngoại lệ, nó sẽ cố gắng để cuộn nó trở lại), vì vậy chỉ cần để cho các ngoại lệ đi và NH sẽ chăm sóc các giao dịch nếu nó đã không cam kết - bạn sẽ nhận được các hiệu ứng tương tự với mã sạch hơn. –