Je dois enregistrer une exception personnalisée pour le dialecte NHibernate. J'ai mis en œuvre et enregistré ISqlExceptionConverter, comme indiqué dans les tests NHibernate. Mais lorsque l'exception dans le code se lève, il n'est pas converti. Mon code de conversion même n'appelle pas.Exception personnalisée utilisant NHibernate ISqlExceptionConverter
Mon code est très simple:
try
{
using (ISession sess = OpenSession())
using (ITransaction tx = sess.BeginTransaction())
{
....
sess.Save(obj); // invalid object scheduled for inserting
.....
tx.Commit(); // exception raises here
}
}
catch (UniquenessViolationException ex)
{
// never came here, since exception was not converted and is of type
HibernateException
}
Ma mise en œuvre de ISqlExceptionConverter:
public class SqlExceptionConverter : ISQLExceptionConverter
{
public Exception Convert(AdoExceptionContextInfo exInfo)
{
var sqlEx = ADOExceptionHelper.ExtractDbException
(exInfo.SqlException) as SqlException;
if (sqlEx != null)
{
if (sqlEx.Number == 2627)
return new UniquenessViolationException(exInfo.Message, sqlEx,
exInfo.Sql);
}
return SQLStateConverter.HandledNonSpecificException
(exInfo.SqlException, exInfo.Message, exInfo.Sql);
}
Peut-être que je raté quelque chose?
Je viens de frapper un problème similaire où j'essaie de forcer une exception dans la pile dans un test unitaire; l'appel à Session.Flush lève l'OracleException natif et n'exécute pas la classe de convertisseur enregistrée. –