C# 向用户报告异常消息时的最佳做法

C# 向用户报告异常消息时的最佳做法,c#,.net,asp.net,asp.net-mvc,exception,C#,.net,Asp.net,Asp.net Mvc,Exception,在我的ASP.NET MVC应用程序中,我不想向用户报告所有异常消息。但是我想向用户报告某些类型的异常,因此我创建了一个操作过滤器来确定它是否是这种特定类型的异常,如果是,则显示异常的消息,否则显示一条通用消息。所以我创建了一个名为ClientException的自定义异常 我的过滤器如下所示: if (filterContext.Exception is ClientException) message = filterContext.Exception.Messag

在我的ASP.NET MVC应用程序中,我不想向用户报告所有异常消息。但是我想向用户报告某些类型的异常,因此我创建了一个操作过滤器来确定它是否是这种特定类型的异常,如果是,则显示异常的消息,否则显示一条通用消息。所以我创建了一个名为ClientException的自定义异常

我的过滤器如下所示:

    if (filterContext.Exception is ClientException)
         message = filterContext.Exception.Message.Replace("\r", " ").Replace("\n", " ");
   else
        message = "An error occured while attemting to perform the last action.  Sorry for the inconvenience.";

    filterContext.HttpContext.Response.Status = "500 " + message;

我阅读了这篇文章,作者建议使用现有的.NET异常类型来报告使用错误。然而,通过引入我的自定义异常,我只需在过滤器中执行一次检查。我的方法行吗?

如果你的方法对你有效,那就行了。微软的博客建议您使用他们的异常类,您对此感到惊讶吗?;)

不过,有些.NET库功能和第三方OSS功能只适用于.NET例外情况


为了充分利用这两个方面,您可以将.NET异常对象扩展到您自己的对象中。

我将根据异常类型使用不同的阈值,这些阈值将与异常消息相关联


根据特定的阈值逻辑,您可能需要决定是否显示异常。

您的方法很好,但还有其他选择。(我们是软件开发人员,所以总有其他选择。)


您可以利用字典来存储一个标志,指示异常是否为客户端异常。然后,您可以让过滤器检查是否存在该标志。

出于几个原因,我喜欢这种方法

首先,它安全地失效。如果有人没有明确抛出ClientException,则不会报告异常详细信息。忘记展示东西的问题比不小心展示东西的问题要小

其次,它允许在适当的位置决定是否显示异常。例如,并非所有IOException都会显示。有些可能是,有些则不会。可以在调用堆栈中的任何位置捕获和转换特定异常,以便在已知正确的位置进行转换

这两件事加在一起意味着未来的开发人员将不会适当地更改要显示的整个异常类,或者认为某些内容在实际显示时不会显示

另外,使用特定异常类型的目的是确定稍后要采取什么操作来响应该异常。“向用户显示此消息”是一个非常好的指定操作。一旦做出决定,那么例外的确切性质就完全不相关了。(当然,出于日志记录的目的,最初的问题可能存在于InnerException属性中。)


因此,在我看来,这是一个很好的设计。

我对该解决方案的担忧是,这些异常很可能是由业务层中的对象(或MVC术语中的模型对象)引发的。您所描述的用法确实是我将要考虑的一个演示文稿。

通常,您需要重新显示模型中的任何异常,只是为了告知是否可以向用户公开该异常。 您希望用户如何处理这些信息?如果用户可以修复这种情况,那么可能不应该有异常来通知状态开始

我会坚持捕捉每个案例的特定异常,并当场做出演示决策。不过,您可以将捕获的异常作为模型发送到视图。我仍然会让控制器决定,而不是由谁抛出异常