MVC3 アプリにログインするために Elmah を実装しましたが、もちろんすべて問題ありませんが、シグナリングを使用してカスタム例外をログに記録する場合、Elmah はカスタム例外の InnerException プロパティを「参照」しているように見えますが、カスタム例外は表示されません。例外そのもの。
以下のコードを使用して例外を通知すると、エラー ログに「CtsDataException: エラー」と表示されるのではなく、予想どおり、「DbEntityValidation: Validation failed for one or more entities.」と表示され、内部例外とそのメッセージ。ログ項目を開くと、カスタム例外が正しくログに記録されていることがわかります。そのため、実際のログ エントリではなく、「例外記述子」が間違っているように見えます。
私は何を間違っていますか?
PS、私のカスタム例外は次のとおりです。
public class CtsDataException: Exception
{
public CtsDataException(string message, Exception innerException): base(message, innerException)
{
ValidationResults = new List<CtsDbValidationResult>();
var vex = innerException as DbEntityValidationException;
if (vex != null)
{
ValidationResults = vex.EntityValidationErrors.Select(e => new CtsDbValidationResult(e)).ToList();
}
}
public IEnumerable<CtsDbValidationResult> ValidationResults { get; set; }
}
シグナリング コードは次のようになります。
protected void HandleDbEntityValidationException(DbEntityValidationException vex, string message)
{
var ctsEx = new CtsDataException(message, vex);
ErrorSignal.FromCurrentContext().Raise(ctsEx);
}
HandleDbEntityValidationException
私のベースコントローラーにあります。次のような派生コントローラーで呼び出されます。
catch (DbEntityValidationException vx)
{
var msg = string.Format("Error updating employee '{0}'", entity.RefNum);
HandleDbEntityValidationException(vx, msg);
}