gpt4 book ai didi

asp.net-mvc - ASP.Net MVC try catch 最佳实践

转载 作者:行者123 更新时间:2023-12-04 17:04:36 25 4
gpt4 key购买 nike

谁能指导我有关在ASP.NET MVC中处理异常的最佳实践是什么?

  • Controller ?
  • 模型?
  • 模型(包含EF逻辑,即保存,更新等)抛出任何异常并捕获到Controller中吗?
  • 最佳答案

    在您可能期望特定异常的任何方法或代码块中(与可能不可用的数据库或外部服务进行交互等),都将该代码包装在“尝试/捕获”中以捕获特定异常有问题。您想确切地知道发生了什么类型的异常以正确处理它们。 (自然,使用Final代码块来处理所有打开的资源。)如何正确处理它们取决于您以及您希望应用程序如何运行。

    您绝对应该具有全局异常处理功能,以捕获任何落入裂缝中的意外事件。任何时候,未处理的异常都不会冒犯到用户。全局异常处理程序应仅向用户显示友好的错误消息,并应记录异常并通知您发生了什么情况。通常,一个好的目标是识别异常并添加错误处理代码,以在异常上升为全局之前捕获其局部状态。随着时间的流逝,目标应该是尽可能减少全局异常,并使任何可能产生异常的代码具有自己的错误处理程序,以防止这些情况发生。

    后者的示例可能像接收您要在使用这些参数之前检查的null参数的特定方法一样简单。但是,您要避免的一件事是对逻辑流使用异常处理。例如...

    假设您有一个采用自定义对象作为参数的方法:

    public MyMethod(MyObject obj)
    {
    // ...
    }

    您的原始代码假定 obj将始终具有一个值。但是,在生产中使用了一段时间后,您发现 obj有时是 null,并且从该方法中抛出了 NullReferenceException,该方法被全局异常处理程序捕获。

    您可能会想只将 MyMethod中的代码包装在其自己的Try/Catch块中以捕获该异常。这不一定是一个好主意(尽管在某些情况下是这样)。相反,您想在方法开始时检查 null:
    public MyMethod(MyObject obj)
    {
    if (obj == null) throw new ArgumentNullException("obj can not be NULL");
    // ...
    }

    这样可以更好地封装该方法,并允许它引发受控异常。异常不是坏事,只是意外的异常。请注意,以上内容仍将引发异常,该异常仍会冒泡至全局处理程序。因此,将这个方法的调用包装在Try/Catch块中也是一个好主意,以便捕获 ArgumentNullException并进行相应的处理。也许调用此方法的代码可以修复空引用,然后重试,也许可以尝试其他操作,等等。如果可能,您仍然不希望它冒泡到全局处理程序,因为这已成为“预期”异常,可以相应地进行处理。

    自然地,您仍然希望避免在上面的示例中引发/捕获预期的异常,因此在调用该方法之前应该对 null进行类似的检查,以便甚至不调用该方法。

    也许如果对象是 null,则可以直接向用户显示错误消息并记录错误,并尽可能多地通知您有关事物状态的信息,以便您研究为什么是 null并进行修复。根据应用程序的逻辑,那时 null可能是该对象的完全可接受的状态。如果是这样,请检查它是否是 null,不要打扰调用该方法。只要照常进行即可。

    这是很多错误检查和处理代码,但这是一件好事。

    编辑:关于异常处理的另一点注意事项是,只有在当时可以实际处理异常的情况下,才应捕获该异常。如果该方法无法在内部进行处理,请让异常从该方法冒泡到调用方法,依此类推。因此,唯一应到达全局处理程序的异常是您实际上无法在代码中的任何地方处理的异常(这就是修复和防止全局异常的一个好目标)。

    在这种情况下,“句柄”将意味着实际上能够对此做些事情。可能只是记录并继续执行某些操作,也许是执行某些特定逻辑等操作。但是捕获,记录和重新抛出是不好的设计。如果您无法从异常中恢复,请使其冒泡。

    关于asp.net-mvc - ASP.Net MVC try catch 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5729442/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com