我正在尝试使用Exception.ToString()
方法记录异常。但是,我从ToString()
方法获得了一个新的异常 - 它似乎来自堆栈跟踪处理。
原始错误是FileNotFoundException。这是输出:
The process was terminated due to an unhandled exception.
Exception Info: System.IO.FileNotFoundException
at System.Signature.GetSignature(Void*, Int32, System.RuntimeFieldHandleInternal, System.IRuntimeMethodInfo, System.RuntimeType)
at System.Reflection.RuntimeMethodInfo.FetchNonReturnParameters()
at System.Reflection.RuntimeMethodInfo.GetParameters()
at System.Diagnostics.StackTrace.ToString(TraceFormat)
at System.Environment.GetStackTrace(System.Exception, Boolean)
at System.Exception.GetStackTrace(Boolean)
at System.Exception.get_StackTrace()
at System.IO.FileNotFoundException.ToString()
at InSQLMDASDriver.InSQLMDASDriver.Init(System.String, System.String)
at InSQLMDASDriver.InSQLMDASDriverLogic.InSQLMDASDriverLogicInit(System.String, System.String)
at InSQLMDASDriver.InSQLMDASDriverLogic..ctor(System.String, System.String)
at InSQLMDASDriverWCFServer.Service1.MainTread()
at System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Threading.ThreadHelper.ThreadStart()
当我运行此代码时,我可以验证是否从Exception.ToString()抛出异常:
private void Init(string defaultWindowName, string mainPath)
{
try
{
// code that fails
}
catch(FileNotFoundException e)
{
string errorAsString = GetErrorAsString(e);
Logger.Log(string.Format("Init error at line block {0}: {1}", initBlockCounter, errorAsString), level: LogLevel.Error);
throw new Exception("FileNotFoundException: " + e.FileName + ", " + e.FusionLog, e);
}
catch (Exception e)
{
string errorAsString = GetErrorAsString(e);
Logger.Log(string.Format("Init error at line block {0}: {1}", initBlockCounter, errorAsString), level: LogLevel.Error);
throw;
}
}
string GetErrorAsString(Exception e)
{
try
{
return e.ToString();
}
catch(Exception ne)
{
return e.Message + " (ERROR getting stacktrace: " + ne.Message + ")";
}
}
为什么会发生这种情况......?
答案 0 :(得分:2)
这是一个与我的问题相匹配的描述,其中程序集无法加载导致FileNotFoundException,并且调用ToString()会给出另一个异常:
以下是发生的事情。该 Newtonsoft.Json.JsonConvert.DeserializeObject需要 System.Runtime.Serialization.Primitives程序集。但事实并非如此 目前,所以它试图抛出FileNotFoundException。它创建 异常对象,然后它想要为它设置堆栈跟踪。 发现,它查看了异常堆栈跟踪的最顶层框架 那里的Newtonsoft.Json.JsonConvert.DeserializeObject方法 尝试使用反射来获取其参数信息。看着 类型的方法的第二个参数 Newtonsoft.Json.JsonSerializerSettings,它尝试构建元数据 此参数类型的结构。而且不小心,其中一个领域 这种类型的StreamingContext类型来自 System.Runtime.Serialization.Primitives程序集。详细了解 类型,它试图加载这个组件 - 因为它没有 存在(这是我们正在尝试的原始异常的原因 构建堆栈跟踪),它抛出异常,结果是什么 你可以看到。