我有一个自定义异常,我使用如下所示的反射覆盖Data
属性...
public class MyCustomException : Exception
{
private readonly SomeModel _log;
public MyCustomException(SomeModel log)
: base(string.Format("Could not insert to some table"))
{
_log = log;
}
public override System.Collections.IDictionary Data
{
get
{
var data = new Dictionary<string, object>();
foreach (PropertyInfo pinfo in _log.GetType().GetProperties())
{
data.Add(pinfo.Name, pinfo.GetType().GetProperty(pinfo.Name));
}
return data;
}
}
}
当抛出上述异常时,它会被记录到elmah,但不会记录Data
。
我必须做出哪些更改才能将Data
记录到elmah?请指教。
答案 0 :(得分:1)
Detail
对象的Elmah.Error
属性 - 然后由ErrorLog
类处理 - 是根据异常的ToString()
方法构建的。
// Elmah.Error
public Error(Exception e, HttpContext context)
{
// snip
this._detail = e.ToString(); // here
// snip
将您的数据添加到MyCustomException
中的ToString方法的覆盖中,以便在Elmah中查看。
答案 1 :(得分:1)
您的问题目前是ELMAH问题跟踪器上大多数明星的问题:
答案 2 :(得分:1)
在我的控制器中,我在一个事务中执行了一些数据库调用,然后向trypal提交了一个命令,所有这些都在try / catch块中。在catch中,我使用包含电子邮件的消息创建一个新的异常实例,并将innerException属性设置为抛出的异常并抛出新的异常。
我知道丢失一些堆栈跟踪信息是可能的,我在上下文中对此进行了测试,并且堆栈跟踪似乎得到了维护,但控制器内部发生异常,因为此特定控制器和应用程序的层数不多。如果有人有类似情况,这种方法可能是最快捷,最简单的方法。
catch (Exception ex)
{
Exception newException = new Exception(viewModel.ContactEmail, ex);
throw newException;
}
这假设您有一个例外过滤器,例如下面(对于webapi),并且过滤器在global.asax中注册为全局。
public class LogExceptionAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
if (HttpContext.Current != null)
{
ErrorSignal.FromCurrentContext().Raise(actionExecutedContext.Exception);
}
}
}