我们如何在捕获中的异常中获取用户定义对象

Posted

技术标签:

【中文标题】我们如何在捕获中的异常中获取用户定义对象【英文标题】:How can we get user define object in Exception in catch 【发布时间】:2018-10-16 09:37:50 【问题描述】:

我们想要获取导致异常的用户定义数据,例如。索引超出范围异常。

try

    int[] list = new int[2];
    list[0] = 1;
    list[1] = 2;
    list[3] = 3;
    Console.WriteLine(list[4]);

catch (Exception ex)

    /* Expected
     1) Line Number :5
     2) Method Name: SearchArray()
     3) Data: 3 // object specifically
     4) excetion message:ArrayIndexOutOfBound Exception.
    */
    StackTrace st = new StackTrace(ex, true);
    StackFrame frame = st.GetFrame(0);

    var data = ex.StackTrace;
    var tr = ex.HResult;

在这种情况下,我们想要获取 List[3] 的值,因为这一行负责异常(其中 list[3] 将不会被访问)。

【问题讨论】:

您可以使用 ex.Message 打印您的异常 你想得到字符串“list[3] = 3;”不知何故来自异常对象? 我现在看到了你的期望。您的要求可从堆栈跟踪(源文件名、行号等)中获得,但仅在 DEBUG 构建中可靠地工作,因为在 RELEASE 构建中会发生一些“优化”机制,并且您的某些代码甚至可能被优化. 您无法获取list[3] 的值,因为它未定义。数组list 只包含两个元素。 no..ex.message 没有给我们正确的数据。我想要触发错误时的确切数据 【参考方案1】:

由于您的代码范围在 catch 语句之外,因此您无法访问那里的对象。 作为替代方案,您可以使用 StackTrace 异常。它会在“:”列之后为您提供行号。你可以使用它。但是,它将是发生错误的类的行号,而不是确切的功能。

【讨论】:

我可以在这个例如对象中获取对象吗?在 catch 中列出而不在 catch 中传递列表。 不,这是不可能的,因为列表是在 try 中定义的。为了在 catch 中访问它,您需要在 try.int[] list = new int[2]; 之外定义您的对象。尝试 列表 [0] = 1;列表[1] = 2;列表[3] = 3; Console.WriteLine(list[4]); catch (Exception ex) 错误处理 如果列表定义在尝试之外,那么我们如何得到它? 异常不会给你确切的对象,但可以访问对象。您需要识别提到的行号上的错误。由于您的代码中的错误是合乎逻辑的,而不是编译时错误。逻辑错误就像你被要求做减法的乘法一样。希望它澄清。

以上是关于我们如何在捕获中的异常中获取用户定义对象的主要内容,如果未能解决你的问题,请参考以下文章

.Net 6.0全局异常捕获

java中如何获取throws抛出的异常,并且把异常打印到指定的jsp页面

如何在 python 中捕获异常(在 C++ 中引起)

Android 捕获异常并在应用崩溃后重启应用

求人指点下如何捕获SQL连接异常

测试开发专题:spring-boot自定义异常返回