C# 无法控制异常对象的每个内容(位置不可用)

C# 无法控制异常对象的每个内容(位置不可用),c#,exception,inner-exception,C#,Exception,Inner Exception,出于测试目的,我有一种手动导致应用程序崩溃的方法。它按预期工作,自定义错误页面按我希望的方式显示。然而,我注意到,外部异常(即外部异常)提供了位置信息(即UtilController.cs中的Api.Controllers.UtilController.Poof(),下面最后一行第58行),而内部异常则不提供位置信息(说明但未知位置,但我相信)。呈现的错误消息的完整内容如下所示 例外:没有详细信息,只有错误代码。 GUID:77ad89f7-7220-43b6-8fe9-d473e18ff07b

出于测试目的,我有一种手动导致应用程序崩溃的方法。它按预期工作,自定义错误页面按我希望的方式显示。然而,我注意到,外部异常(即外部异常)提供了位置信息(即UtilController.cs中的Api.Controllers.UtilController.Poof(),下面最后一行第58行),而内部异常则不提供位置信息(说明但未知位置,但我相信)。呈现的错误消息的完整内容如下所示

例外:没有详细信息,只有错误代码。
GUID:77ad89f7-7220-43b6-8fe9-d473e18ff07b
有关一般信息,请参见外部文本。
未知位置

例外:这是在07:21:15时调用的崩溃测试。
有关详细信息,请参阅内部异常。
UtilController.cs第58行中的Api.Controllers.UtilController.Poof()

我理解,因为内部异常只是实例化的,而不是实际抛出的,所以没有它的起源位置。我想将内部异常提供的位置文本更改为自定义文本

在调查对象的内容时,我发现只有两个属性似乎是用于该目的的-源和目标站点。但是,设置这些值并没有对值进行任何更改(尽管不是只读的,但仍保持为null),因此我得出结论,它们会以某种方式被覆盖。我也没有发现任何字段的字符串值与任何地方的位置相对应,即使在调用了throw之后也是如此

public ActionResult Poof()
{
  string occasion = DateTime.Now.ToString("HH:mm:ss");
  string message = "This is a crash test invoked @ " + occasion + "."
    + "\nSee inner exception for details.";
  string details = "There are no details but the error code."
    + "\nGUID: " + Guid.NewGuid()
    + "\nSee outer text for general info.";

  Exception innerException = new Exception(details);
  innerException.Source = "Location as referred below.";
  // innerException.TargetSite = new DynamicMethod(...);
  Exception exception = new Exception(message, innerException);

  throw exception;
}
  • 异常对象中的位置信息字符串在哪里
  • 何时/如何分配他们
  • 我可以更改它们吗?如果可以,如何更改

我已经阅读了WebAPI和general中的文档(包括诸如和for)。我觉得我理解这些内容,但事实证明并非如此。投入研究的努力,我需要帮助澄清上述三项。

这里的主要问题是,实际上只有一个异常被抛出

外部异常有一个位置,因为它被抛出了

已创建内部异常并将其添加到外部异常,但内部异常不是引发和捕获的异常。因此,运行时不会填充任何位置信息

例如,下面的测试示例

[TestClass]
public class MyTestClass {
    [TestMethod]
    public void MyTestMethod() {
        string occasion = DateTime.Now.ToString("HH:mm:ss");
        try {
            string details = "There are no details but the error code." + "\nGUID: " + Guid.NewGuid() + "\nSee outer text for general info.";
            Exception innerException = new Exception(details);
            innerException.Source = "Location as referred below.";
            throw innerException;
        } catch (Exception e) {
            string message = "This is a crash test invoked @ " + occasion + "." + "\nSee inner exception for details.";
            Exception exception = new Exception(message, e);
            throw exception;
        }
    }
}
运行测试时显示以下消息

结果堆栈跟踪:
在C:\…\UnitTest1.cs中的UnitTestProject.tests.MyTestClass.MyTestMethod()处:第33行
---内部异常堆栈跟踪的结束---
在C:\…\UnitTest1.cs中的UnitTestProject.tests.MyTestClass.MyTestMethod()处:第37行
结果消息:
测试方法UnitTestProject.tests.MyTestClass.MyTestMethod引发异常:
System.Exception:这是在20:34:49时调用的崩溃测试。
有关详细信息,请参阅内部异常。-->系统异常:没有详细信息,只有错误代码。
GUID:2a9bd143-6647-4774-9ea4-615d7f1d2f9f
有关一般信息,请参见外部文本。
如果测试重写如下

[TestClass]
public class MyTestClass {
    [TestMethod]
    public void MyTestMethod() {
        try {
            Core();
        }catch(Exception ex) {
            var temp = ex; //<-- PUT BREAKPOINT HERE
        }
    }

    private static void Core() {
        string occasion = DateTime.Now.ToString("HH:mm:ss");
        try {
            string details = "There are no details but the error code." + "\nGUID: " + Guid.NewGuid() + "\nSee outer text for general info.";
            Exception innerException = new Exception(details);
            innerException.Source = "Location as referred below.";
            throw innerException;
        } catch (Exception e) {
            string message = "This is a crash test invoked @ " + occasion + "." + "\nSee inner exception for details.";
            Exception exception = new Exception(message, e);
            throw exception;
        }
    }
}

参考资料

作为旁白,我希望更多关于Stack Overflow的问题能够显示出这种水平的关注和研究,以证明您从何处获得信息,您尝试了什么,以及为什么结果与您的期望不一致。(我也认为这是你拥有2.5万英镑声誉的部分原因,但当我看到这一点时,我仍然很欣赏。)至于你的实际问题,我将感兴趣地关注;我以前偶然发现过这种行为,但在我的应用程序中,它还没有成为一个足够大的问题来激励我去尝试并找到答案。@JeremyCaney这是我通常坚持的标准,帮助别人帮助我。某些问题需要更多的故事,而另一些问题则不需要,但我总是尽量把它写得足够好。不过,你会惊讶地发现,尽管问题的质量与此相当,但我还是被否决了。有些人把不抓和抓不住混淆起来。所以你的善良的确让我很开心。谢谢。这是一个非常好的回答!因此,为了验证我是否正确——我试图篡改异常内容的方式,这不是一个好主意,对吗?这些都是由系统来处理的,虽然包含可设置的属性,但我不应该在那里到处乱跑。这是一个看不到的情况,对吗?(除非我们继承并明确地做所有的事情。)@KonradViltersten关于这一点总结得很好。
public override StackTrace {
    get {
        string original = base.StackTrace;
        
        string result = //...altered message
        
        return result;
    }
}