Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET-何时使用自定义异常?_C#_Asp.net_Exception - Fatal编程技术网

C# ASP.NET-何时使用自定义异常?

C# ASP.NET-何时使用自定义异常?,c#,asp.net,exception,C#,Asp.net,Exception,嘿,我一遍又一遍地听说我应该在我的web应用程序中始终使用自定义异常。。问题是,我看不出有任何理由在全局.asax(写入数据库等)中处理自定义异常。。那么我为什么要使用它们呢?我几乎从不使用自定义异常。当我手动抛出异常时,我会提供一条详细的消息 我发现异常的维护不值得这么麻烦 更新 让我们把它放到上下文中去。问题是是否有人应该在web应用程序中创建自定义异常。我设想这是一个基本的crud应用程序 Web应用程序 在Web应用程序中,几乎不需要自定义异常。数据正在写入数据库,数据正在从数据库中读取

嘿,我一遍又一遍地听说我应该在我的web应用程序中始终使用自定义异常。。问题是,我看不出有任何理由在全局.asax(写入数据库等)中处理自定义异常。。那么我为什么要使用它们呢?

我几乎从不使用自定义异常。当我手动抛出异常时,我会提供一条详细的消息

我发现异常的维护不值得这么麻烦

更新

让我们把它放到上下文中去。问题是是否有人应该在web应用程序中创建自定义异常。我设想这是一个基本的crud应用程序

Web应用程序

在Web应用程序中,几乎不需要自定义异常。数据正在写入数据库,数据正在从数据库中读取。然后,数据被某种UI使用:MVC、WPF、WebForms。。。等等。在这样的应用程序中,没有自定义异常的机会。每个应用程序都是不同的,因此会有例外

框架

框架是一种完全不同的动物。作为一名框架开发人员,您的工作是提供错误发生原因的可见性。我希望框架中出现详细的异常,可能是自定义的,也可能不是。我希望有足够的信息来解决这个错误

正如@Wyatt-Barnett指出的,一个新的异常应该提供更多的东西,这是现有类所不能做到的

创建自定义异常的原因

  • 传达更详细和具体的信息 关于错误
  • 为了提供捕获此错误条件的方法(即“FileNotFoundExeception”,这允许在更高的层上做出业务决策。)

  • 对于将使用您正在编写的类的代码来说,为给定的异常或问题提供适当的异常类是非常重要的

    例如,
    TextWriter
    的方法可以引发以下异常:

    ArgumentNullException
    ObjectDisposedException
    IOException
    FormatException
    

    想象一下,如果该方法只抛出
    异常

    ,那么您的代码将成为一个好主意,可以创建您自己的自定义异常,而不仅仅是使用带有描述性错误的标准类型的异常。我认为,在某个时候,您需要向异常添加更多数据。例如,假设您有一个导入例程,当您得到损坏的数据时,您不只是抛出InvalidOperationException,而是可以抛出ImporterException,并在所述异常中包含导入的行号和原始数据?

    让我们分析一下异常的使用:

    ArgumentNullException
    ObjectDisposedException
    IOException
    FormatException
    
    当例程遇到这种情况时,我们抛出一个异常:

    “我不能继续”

    当我们的例程遇到这种情况时,我们抛出一个特定的BCL异常:

    “我无法继续,更具体的BCL异常类型之一描述了原因(即FileNotFoundException)”

    当例程遇到这种情况时,我们抛出一个自定义异常类型:

    “我无法继续,因为BCL的任何例外情况都无法向相关方准确描述我无法继续的原因”


    好吧,根据OP的描述,我想他不会做任何不同的事情,仍然会让全局异常处理程序来处理它。类型化异常只有在出于控制流原因计划捕获它们时才有用。有些人出于各种原因选择从不这样做。假设我们有两个类可以抛出FormatException-那么应该有两个不同的try/catch块吗?-看不出自定义异常的任何原因。。只有当我计划在特定的错误页面上进行异常时,Kirk注释才有效。当您认为它将为类消费者提供价值时,您必须这样做。例如,解析文件的类显然需要自己的ParsingException对象。关于您的问题user407674,当一个方法可以抛出多个异常时,只需为每个异常添加一个catch块,并保持一次尝试和最终结果。下面是一个示例:为什么解析文件的类首先需要自己的ParsingException对象作为解析异常捕获。我还添加了一个成员,其中包含导致问题的行,以便进一步处理。啊,因此,对于检查用户篡改和抛出异常(如果为true)这样的简单操作,应该只是一个普通的ArgumentException,因为不需要额外的参数?1+这是一个公平的描述。@JohnIdol在web应用程序中创建自定义异常没有任何好处。在大多数情况下,异常会被转储到HttpApplication中OnError事件所附带的某个日志框架中。我不同意没有任何好处,但这不是我想问的。我不明白你在维护方面的观点,一旦你创建了自定义异常,它需要什么样的维护?@JohnIdol创建它们,如果你认为它们适合你。我创造了它们,认为我是在遵循“最佳实践”。它们妨碍了我。没有附加值--!面向对象!我有一个例外,有一个特别的名字,big deal。最后,我删除了所有自定义类,并将它们替换为带有详细描述的“Exception”。只是需要维护更多的类。即使他们只是坐在那里。我仍然需要查看它们。我发现的良好做法是为web应用程序提供一个特定于应用程序的自定义异常,以明确该异常是否是从应用程序与框架/库/平台引发的。@Yarin这是个好主意。否则,您将在stacktrace中挖掘,以寻找起点。