我怎样才能得到null的对象(如图所示)

How can i get the object that was null as (shown in the picture)

提问人: 提问时间:10/15/2019 更新时间:10/15/2019 访问量:468

问:

带注释的异常描述我正在为 ASP.NET Core 项目创建一个中间件异常处理程序,并且我正在尝试获取异常的来源(如在导致异常的对象中)。当我使用调试器时,我可以看到该对象,但我无法以编程方式获取它。

public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<ErrorHandlingMiddleware> _logger;


    public ErrorHandlingMiddleware(RequestDelegate next, ILogger<ErrorHandlingMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex);
        }
    }

    private Task HandleExceptionAsync(HttpContext context, Exception ex)
    {
        _logger.LogError(ex, ex.Message);
        var code = HttpStatusCode.InternalServerError; // 500 if unexpected


        var result = JsonConvert.SerializeObject(new { Error = ex.Message, Soure = ex.Source });
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = (int)code;
        return context.Response.WriteAsync(result);
    }

我希望异常中的源属性包含它,但它只是显示类。

C# 异常 nullreferenceexception asp.net-core-middleware

评论

1赞 Christopher 10/15/2019
以下是我经常链接的两篇关于异常处理的文章: blogs.msdn.microsoft.com/ericlippert/2008/09/10/... |codeproject.com/Articles/9538/......要找到原始原因,您必须对内部异常进行递归。但通常只获取 Exception.ToString() 并记录或公开它要简单得多。
0赞 10/15/2019
@Christopher感谢您的帮助,但我刚刚尝试过,不幸的是它没有包含我需要的信息。如果检查图片,您会发现导致明确提及的 null 引用的实体
0赞 Christopher 10/15/2019
此执行的意思是。“伙计,查找背后没有对象!如果您不给我一个实例,我将无法访问实例函数或字段”。考虑到您通过对邮件地址列表进行字符串比较来获取查找值,您真的必须期望找不到任何东西。
0赞 10/15/2019
是的,我知道我需要它来吐出“查找”,这就是我正在努力做的事情。更准确地说,我正在尝试从异常对象访问它。
0赞 DetectivePikachu 10/15/2019
为什么不直接使用安全导航运算符,从一开始就防止异常发生呢?这里没有神秘之处。例外情况是尝试访问 的属性 when 为 null。lookuplookup

答:

1赞 Christopher 10/15/2019 #1

据我所知,只有一种方法可以做你想做的事: 写一个尝试...catch 块。这根本不可行。

实际上,查找甚至不是这个异常的悲哀。它来自函数解析机制中的某个地方。老实说,我不确定代码是否准确地抛出它,但我知道变量查找完成了它的工作(正确获取、存储和返回“null”),并且对此没有任何过错。

null 值与 Bonehead Exceptions 一起出现。正如字面上提到的。去防止它发生:“骨头异常是你自己的错,你本可以阻止它们,因此它们是你代码中的错误。你不应该抓住他们;这样做是在代码中隐藏一个错误。相反,您应该编写代码,以便从一开始就不可能发生异常,因此不需要捕获异常。这个参数是空的,类型转换是坏的,索引是超出范围的,你试图除以零——这些都是你本来可以很容易地预防的问题,所以首先要防止混乱,而不是试图清理它。

老实说,我无法真正理解这个功能。您是否正在尝试将管理员用户放入数据库?如果是这样,“AdminResponse”在这种情况下意味着什么?

评论

0赞 10/15/2019
我的目标是创建一个可以吐出属性的处理程序,如图所示,我故意导致异常来测试它,它能够返回发生异常的类,我想走得更远一点,并从处理程序中吐出导致错误的属性,如图中箭头所示
0赞 10/15/2019
在图片中,异常有明确的行,说属性“查找”是 null,我想创建一个处理程序,找出(在任何情况下)我尝试访问并发现 null 的属性
0赞 Mr.Mindor 10/15/2019
@Hackavist in general, I don't think this is going to be possible in production code without, as Christopher is pointing out, a lot of work. You are able to get that while debugging because of all the extra work and meta data the debugger is using. That information isn't tracked outside the debugger.
0赞 Christopher 10/15/2019
@Hackavist: The thing is - the Property or Field is in no way, shape or form at fault for this. It did it's job. It took a value. It stored it. It handed it back. Unlike Darth Vader when defending the 1st Death Star, it did it's job. The function whose name you have now hidden is who is responsible for this mess.
0赞 10/15/2019
I get your point now @Christopher, i will try fix all the manageable errors as you mentioned earlier and to follow the exception handling guide lines, Thank you for your Time and Effort