NHibernate에서 예외를 처리하는 가장 좋은 방법은 무엇입니까? 다음과 같이NHibernate 예외 처리
public void Add(Subject subject)
{
using (ISession session = HibernateUtil.CurrentSession)
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(subject);
transaction.Commit();
}
}
을 그리고 단위 테스트 :
나는 다음과 SubjectRepository있어
[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);
}
내가 단위 테스트에 의해 생성 된 오류를 처리하는 지점에 도착했고 조금 붙어있어. 이것은 예상대로 실패하지만 GenericADOException을 사용하면 ConstraintViolationException 또는 비슷한 (데이터베이스 레벨의 주제 코드에 고유성 제한 조건이 있음)을 기대하고있었습니다.
ADOException은 합리적인 오류 메시지가있는 MySQL Exception을 래핑하지만 내부 예외를 throw하여 캡슐화를 중단하기를 원하지 않습니다. 특히 MySQL은이 프로젝트의 백 엔드로 확정되지 않았습니다.
이상적으로 나는이 시점에서 예외를 잡아 내고 사용자에게 현명한 오류를 반환 할 수 있기를 바랍니다. NHibernate Exceptions을 처리하고 무엇이 잘못되었는지와 왜 사용자에게 백업되었는지에 대한 문서화 된 모범 사례 접근 방법이 있습니까?
감사합니다,
매트
예외를 배치하는 것이 가장 좋은 방법이라고 생각합니다. 내부 예외는 MySQLException의 행을 따라 발생합니다. Message = "키 3의 중복 엔트리 'En'입니다. 프런트 엔드에서 직접 호출하므로 의미있는 메시지를 보내고 싶습니다. –
모든 예외를 잡아서 감싸는 것이 좋은 생각입니까? – VikciaR
예외를 다시 던지면이 코드의 대부분을 제거 할 수 있습니다. 트랜잭션이 명시 적으로 커밋되지 않은 경우 세션이 닫힐 때 롤백됩니다 (또는 커밋 호출이 예외를 throw하는 경우 분명히 롤백을 시도합니다.) 따라서 예외를 적용하고 NH가 커밋하지 않은 경우 NH이 트랜잭션을 처리하게합니다. 코드를 깨끗하게 만들면 동일한 효과를 얻을 수 있습니다. –