在.net中处理异常

本文关键字:异常 处理 net | 更新日期: 2023-09-27 18:12:52

我在这里问了一些问题,并阅读了一些关于异常处理的文章,但我认为我并没有真正理解什么时候应该处理异常,什么时候不应该处理异常。从我读过的文章中,它指出"只处理可以恢复的异常"这意味着什么。如果我不能处理异常,我该怎么办?让它传播回堆栈?如果我不处理它,我如何记录它并显示用户友好的错误消息。大多数人在网络应用程序和网络服务中做什么?

举个例子,我有一个较低层的数据层,它从sql中提取数据

try{
  //do something with db
}catch(SqlException ex){
 //what should i do here
 //should i call code again to retry getting data from db
}catch(Exception ex){
 //should i even catch exception of type exception
}

如何处理较低层中的异常?我应该让这个例外在各个层次上冒泡吗?如果是这样的话,那么如果我想捕获sqlexception类型的异常,那么我需要对sqlexceptions所属库的引用,但我肯定不应该在与数据访问无关的层中引用该库。

在.net中处理异常

一些简单的基本规则:

  • 处理异常需要程序的状态与导致异常的代码启动前完全相同。您将需要大量的catch和finally块来将变量恢复到其初始状态。

  • 只有在捕获异常允许程序以有意义的方式继续运行时,才考虑处理异常。例如,当数据库服务器离线时,很难做任何有用的事情,不妨停止程序。

  • 如果你需要一个人采取纠正措施(你几乎总是这样做(,那么请确保她有足够的信息来解决问题。让异常冒泡到UI层。避免解释异常(例如,没有"无法更新数据库"(,显示确切的异常消息和堆栈跟踪。

  • 实现AppDomain的处理程序。CurrentDomain。UnhandledException并记录或显示e.ExceptionObject的值。有助于诊断未处理的异常。并帮助您避免到处都是渔获物。

  • 一百个具有良好诊断的未处理异常比一个捕获的异常要好,后者会破坏程序的稳定,从而生成坏数据或导致引发其他不相关的异常。

异常管理是一个很大的主题,所以我在这里只触及表面。

从我读过的文章中,它说"只处理可以恢复的异常"这是什么意思。

如果你不知道如何从特定的异常中恢复,那么通常捕捉它没有任何意义。如果它是一个web应用程序或服务,则web服务器本身将处理日志记录和恢复。

在某些情况下,您需要捕获异常,以便进行一般恢复,例如通过取消或冲销事务。在这种情况下,可接受的方法是
捕获异常,进行一般恢复,然后再次抛出异常。

如果我不能处理异常,我该怎么办?让它支持堆栈?

是的。

如果我不处理它,我如何记录它并显示一条用户友好的错误消息。大多数人在网络应用程序和网络服务中做什么?

web服务器将记录异常。如果你想在网络应用程序中显示一条用户友好的错误消息,你可以在堆栈的最高级别捕获/记录并重定向到你的错误消息。再说一次,我尽量不去抓System。异常-相反,列出应用程序抛出的异常,并在呈现针对每种类型的消息之前捕获这些类型。随着异常类型列表的增加,可以通过更改代码来阻止每个新的异常类型,也可以为该异常类型添加新的catch。

在web服务中,您可以创建自定义异常,并将其作为节点添加到web服务将提供的通用异常中。

在您的代码示例中,我不会使用try。。。catch,除非你正在期待一个异常,并且你知道该怎么处理它。

如何在较低级别中处理异常。我应该让这个例外在各个层次上冒泡吗。

是的。

好吧,这太简短了,因为现在还很早,但我一直在努力解决同样的问题,所以我的理解是:

"只处理您可以从恢复的异常">

我在这里的理解是,你可以将异常处理到代码中的一个级别,在这个级别上你可以对它采取一些措施。在你的低级别代码的情况下,你可以让异常重新出现在一个层中,在这个层中你可以修改你的"进程"来处理异常,并可能再次尝试该进程。(我通常会在抛出错误的地方记录错误。(