NHibernateの例外を処理するためのベストプラクティスは何ですか?NHibernateの例外の処理
私は、次のとSubjectRepository持って次のように
public void Add(Subject subject)
{
using (ISession session = HibernateUtil.CurrentSession)
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(subject);
transaction.Commit();
}
}
とユニットテストを:
[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をラップしますが、内部例外をスローするだけでカプセル化を中断したくないということです。特にMySQLはこのプロジェクトのバックエンドとして最終化されていません。
理想的には、私は例外をキャッチして、現時点でユーザに賢明なエラーを返すことができるようにしたいと考えています。 NHibernate Exceptionsを処理し、何がうまくいかなかったのか、そしてなぜそれをユーザーに報告するかに関する文書化されたベストプラクティスのアプローチはありますか?
おかげで、
マット
私は例外をラッピングすることも最良の選択肢だと思います。 内部例外は、MySQLExceptionの行に沿ったものです。メッセージ= "重複するエントリ 'En'(キー3)。 これはフロントエンドから直接呼び出されるため、意味のあるメッセージを返すことにしたいと思います。 –
すべての例外をキャッチしてラップするのは良い考えですか? – VikciaR
このコードの大部分を削除することができます。トランザクションを明示的にコミットしないと、セッションが終了したときにロールバックされます(またはコミット呼び出しによって例外がスローされた場合それをロールバックしようとする)ので、例外を実行し、コミットしていなければNHがトランザクションを処理します - あなたはよりクリーンなコードで同じ効果を得るでしょう。 –