为什么 System.Exception.ToString 不为内部异常调用虚拟 ToString?

2024-02-22

这是 .NET 的实际来源System.Exception.ToString:

public override string ToString()
{
  return this.ToString(true, true);
}

private string ToString(bool needFileLineInfo, bool needMessage)
{
  string str1 = needMessage ? this.Message : (string) null;
  string str2 = str1 == null || str1.Length <= 0 ? this.GetClassName() : this.GetClassName() + ": " + str1;
  if (this._innerException != null)
    str2 = str2 + " ---> " + this._innerException.ToString(needFileLineInfo, needMessage) + Environment.NewLine + "   " + Environment.GetRuntimeResourceString("Exception_EndOfInnerExceptionStack");
  string stackTrace = this.GetStackTrace(needFileLineInfo);
  if (stackTrace != null)
    str2 = str2 + Environment.NewLine + stackTrace;
  return str2;
}

除了丑陋之外,人们还可以注意到对于所有内部异常,将调用私有的非虚拟 ToString。换句话说,如果你超载ToString在你的例外中如果你的异常恰好是嵌套的,它不会被调用。哦,等等,事实证明内置异常也有同样的问题,例如System.IO.FileNotFoundException打印出文件的路径 - 它不是消息的一部分:

public override string ToString()
{
  string str = this.GetType().FullName + ": " + this.Message;
  if (this._fileName != null && this._fileName.Length != 0)
    str = str + Environment.NewLine + Environment.GetResourceString("IO.FileName_Name", new object[1]
    {
      (object) this._fileName
    });
  ...
}

但是如果你包装一个实例......这个信息将会丢失,除非你自己遍历异常树并检测异常的类型或调用ToString自己做一些普通的解析。

这是一个恼人的不便,使得记录/写入错误对话框要么丢失信息,要么容易出现错误。有趣的是,Mono 做对了 https://github.com/mono/mono/blob/master/mcs/class/corlib/System/Exception.cs#L317.

.NET版本中是否有什么隐藏的智慧呢?

编辑:这不是基于意见的问题。虽然我觉得这种设计选择很烦人,但我想知道这种方法的好处。了解它们在设计新的解决方案时可能会有所帮助。


Exception.ToString()不是应该呈现给用户的东西。它is应该向开发人员提供的内容,也许在日志文件中。

ToString() 的默认实现通常会做“正确的事情”。注意它如何处理嵌套异常和多个异常(例如AggregateException or SqlException),甚至跨越远程处理边界的异常。尝试使用 XML 序列化程序在 XML 反序列化期间遇到错误,您会真正体会到它为您提供的信息量 - 通常足以直接指出异常的原因。

如果您希望看到显示某些特定内容,那么您应该就该问题与 Microsoft 联系。特别是,您不太可能让他们简单地调用您重写的 ToString。显然,他们不愿意。但是,如果您的 ToString 想要显示他们没有的内容,那么请与他们交谈,看看是否有其他方法可以实现,或者他们是否可以在未来的版本中做一些事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 System.Exception.ToString 不为内部异常调用虚拟 ToString? 的相关文章

随机推荐

  • Android 无效负载类型

    新的更新后 我发现操作栏和 LG 设备中可扩展 格式化字符串的兼容性问题 这是我之前的代码 SpannableString s new SpannableString About s setSpan new TypefaceSpan thi
  • 阻止用户调整 ListView 中的列宽?

    我的 Winform 中有一个 ListView 有 4 列 名称 金钱 ID 和级别 问题是当我运行我的应用程序时 我仍然有能力弄乱列宽 并改变它们 我搜索并发现我应该做这样的事情 private void listView1 Colum
  • MySQL 删除表

    我将使用什么 MySQL 语法来删除与它们具有相似模式的多个表 就像是 DROP TABLES FROM Database1 LIKE SubTable 由于准备好的语句支持 DROP TABLE 因此可以通过以下方式完成 SET tabl
  • Matplotlib 文本不会以 xkcd 字体显示

    当将 xkcd 与 matplotpib 一起使用时 没有任何字体以通常的漫画字体显示 有什么改变或者我做错了什么吗 x df Time y df Adjustment fig plt figure ax fig add subplot 1
  • 随机顺序和分页 Elasticsearch

    In 这个问题 https github com elasticsearch elasticsearch issues 1170 issuecomment 4587811是使用可选种子进行排序的功能请求 允许重新创建随机顺序 我需要能够对随
  • 使用 Javascript 替换文本字符串中的某些阿拉伯语单词[重复]

    这个问题在这里已经有答案了 我有一个阿拉伯语文本字符串 我想将一些单词加粗并在单词前添加图标 我用于英文文本的方法是 var wordsToBold Properties How To Use function makeBold input
  • 设置 urllib2.request() 调用的超时

    我需要设置超时urllib2 request 我不使用urllib2 urlopen 因为我正在使用data的参数request 我该如何设置这个 虽然urlopen确实接受data参数为POST 你可以打电话urlopen on a Re
  • 使用 Snap.svg 循环播放动画

    背景 我使用 Snap svg 渲染一个圆 然后在悬停时为其半径设置动画 我已经用下面的代码处理了该部分 Problem 我试图获得一次循环 脉冲 效果circleRadar悬停在上面 这将涉及在初始r和新的r70 虽然文档提到了 snap
  • 如何检查系统是否支持“单调时钟”?

    我需要在代码中处理超时场景并想使用clock gettime CLOCK MONOTONIC 如果系统支持单调时钟 ifdef CLOCK MONOTONIC clock gettime CLOCK MONOTONIC spec else
  • 错误:Firebase ID 令牌已过期

    在我的服务器上 我在使用 firebase admin sdk 时看到这些错误 verifyIdToken Firebase ID 令牌已过期 从您的客户端应用程序获取新令牌并重试 Firebase ID 令牌具有 kid 声明 该声明与已
  • 什么是 PasteDeploy?如果 Python 中的 Eggs 被视为消失了,我是否需要学习它?

    我对 Python 还很陌生 我已经下载了金字塔框架并一直试图理解它 它使用许多单独的工具来完成工作 例如一些PasteDeploy 我尝试阅读PasteDeploy的手册 http pythonpaste org deploy 但什么也听
  • 如何获取 jqGrid 中显示的行数?

    也许这些信息就在那里 我的谷歌搜索让我失望了 但我似乎找不到答案 我怎样才能得到行数当前显示的在 jqGrid 中 我在这个主题上找到的每个问题和答案都会告诉您如何获得total行数 显示或不显示 或行数loaded通过外部服务 相反 我试
  • 与功能较弱的 GPU 相比,Tesla V100-SXM2-16GB GPU 上的 keras 启动时间 (_make_train_function()) 非常慢

    跟进 GPU 机器上的 keras 和 TensorFlow 有些部分非常慢 https stackoverflow com q 47296197 590335 从tensorflow 1 4运行mnist cnn py 稍微修改 主要添加
  • 如何在 jQuery 中隐藏表格列?

    我有一张有很多列的桌子 我想为用户提供选择要在表中显示的列的选项 这些选项将是与列名称一起的复选框 那么如何根据复选框隐藏 取消隐藏表格列呢 隐藏 使用 hide 每行中的每个 td 是否有效 也许我可以将复选框值分配给表中列的位置 所以第
  • 如何在 PHP 中写入错误日志文件 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我想在执行 PHP 代码时向错误日志文件写入一条消息 我正在尝试使用 PHPerror log 功能Docs http php net fu
  • 如何更改 Visual Studio 2012 (C++) 中的默认 .exe 图标

    我想知道是否有办法更改 VS2012 在编译我的应用程序时生成的默认图标 对于那些想知道的人 我正在尝试更改 exe 程序的图标 而不是窗口左上角和开始菜单上的窗口图标 我已经知道该怎么做了 我一直在谷歌搜索这个 它总是显示如何更改窗口图标
  • 如何仅使用 CSS 移动屏幕进行检测

    我在这里发现了很多讨论 CSS 和移动屏幕的主题 经过搜索 我找不到某些设备的解决方案 例如 摩托罗拉 Moto G4 Plus 使用全高清宽度 1080px 只有引导程序检测 xs view 配置 造型 尝试 尝试我无法设置某些样式 那么
  • 如何在 C# 中通过客户端识别我的服务器名称以进行服务器身份验证

    我最近一直在尝试用 C 制作 SSL 加密的服务器 客户端 我已关注this http msdn microsoft com en us library system net security sslstream aspx然而 MSDN 上
  • 将整数值存储到 firebase 的变量中

    我有一个小问题 我试图从我的 firebase 数据库中获取一个数字 问题是我可以获取该数字 但似乎我在将其存储在整数中时做错了 我想做的是从 firebase 获取号码并将其与我的应用程序的版本号进行比较 这样我就可以告诉我的用户如果应用
  • 为什么 System.Exception.ToString 不为内部异常调用虚拟 ToString?

    这是 NET 的实际来源System Exception ToString public override string ToString return this ToString true true private string ToSt