Exception.ToString()抛出异常

时间:2017-06-06 10:27:15

标签: c# .net

我正在尝试使用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 + ")";
          }
    }

为什么会发生这种情况......?

1 个答案:

答案 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程序集。详细了解   类型,它试图加载这个组件 - 因为它没有   存在(这是我们正在尝试的原始异常的原因   构建堆栈跟踪),它抛出异常,结果是什么   你可以看到。

https://github.com/dotnet/coreclr/issues/3412