无论如何,我有点混淆什么时候传播异常,什么时候包装,和差异.

目前,我的理解告诉我,包装异常将涉及到像DriveNotFound(在IO中)的异常,然后用一般的IOException包装它.

但是,传播一个异常的概念,只有当我有一个空的catch子句时才会发生这种情况吗?所以在ASP.NET网络应用程序中,它将传播到global.asax.或者在最近部署的Web应用程序的情况下,未处理的HTTPException给出了一个黄色的死亡屏幕,并将一个日志写入Windows Server(这是一个我正在重写的Web应用程序).所以异常发生在一个方法中,它可以在类级别处理,显示在页面中,然后升级到global.asax或Windows Server.

为什么我要用更通用的方法来包装异常?规则是处理最具体类型的异常(因此DriveNotFound显然是未找到的驱动器).另外,如何在包装和替换异常之间进行选择?

异常处理链只是try和catch(或catch)的子句?我从这个措辞来看,是的.

最后,为什么以及如何让异常传播到callstack?

我已经阅读了关于异常处理的MS PandP指南,但是我猜这些例子并没有让我充分了解一切.

这个问题来自于企业库的包装/传播异常等的能力.我不知道传播的方式,以及替换/包装异常的差异.

另外,是否可以将复杂的错误处理逻辑插入到catch块中(例如ifs / elses和类似的东西).

谢谢

解决方法

不少于6个问题:-)

But with the concept of propagating an exception,is this only something that happens if I have an empty catch clause?

异常将向上传播,直到被捕获块进一步捕获到处理特定异常类型的调用堆栈或更接近异常层次结构的基本类型的异常类型.所以,例如,所有托管异常都来自于System.Exception,所以拦截System.Exception的catch块将捕获每个受管异常.

Why exactly do I want to wrap an exception with a more generic one?

我不知道你的意思是“包装”.您是否意味着捕获异常,将其替换为另一个异常,并将原始代码添加为新异常的InnerException属性?或者是其他东西?

我认为很少有一个很好的理由用更通用的异常来替换异常.但是,您可以将异常替换为另一个例外,其中一个或多个原因有三个:

从主叫方隐藏实现细节.
>提高抽象级别,使其对调用者更有意义.
抛出一个非常具体的问题的自定义异常.

Also,how would I choose between wrapping and replacing an exception?

我很抱歉,但我仍然不明白你如何将这两个定义为不同的.

Is the exception handling chain just the try and catch (or catches) clauses?

以下是抛出异常时会发生什么的基础知识:

> CLR沿着本地Try … End Try块中的Catch块列表顺序排列,寻找具有与引发的异常匹配的异常过滤器的本地Catch块.
>如果本地Catch块具有与抛出的确切异常相匹配的异常过滤器,则该Catch块中的代码将被执行,后面是Finally块中的代码.然后在End Try之后的第一个语句继续执行.
>或者,如果抛出的异常从本地Catch块指定的异常派生,则相同的操作如第二步所述.例如,捕获ArgumentException的异常过滤器也将捕获从ArgumentException派生的异常,例如ArgumentNullException,InvalidEnumArgumentException,DuplicateWaitObjectException和ArgumentOutOfRangeException.
>如果没有本地的Catch块与引发的异常匹配,CLR将通过方法来追溯调用堆栈方法,寻找一个想要响应异常的Catch块.如果在调用堆栈中找不到匹配的Catch块,则异常被认为是未处理的.
>或者,如果在调用堆栈中找到匹配的Catch块,则执行throw和catch之间的每个Finally块中的代码.这最后属于Try块,其中抛出异常,并在最后的方法下面完成了异常捕获的方法.
>对于捕获异常的所有方法完成此清理后,控制将转移到捕获异常的捕获块,并执行此代码.运行之后的是Try被捕获的Try的finally块.现在调用堆栈已经解卷并且错误清理已经完成,最后一步是在End尝试捕获异常的第一个语句之后继续执行.
>如果Catch块中的代码导致另外的异常被抛出,原始异常将使用InnerException属性自动附加到新异常.以这种方式,可以堆叠异常,而不会丢失任何信息.
>您应该避免将清理代码放在可能引发异常的Finally块中,除非该代码在其自己的Try块中.没有这种增加的保护,CLR的行为就像在Finally块结束之后抛出新的异常,并查找要响应新异常的远程Catch块的调用堆栈.原始的例外将会丢失,除非原来的Catch块保存.

Finally,why and how would I want to let an exception propagate up the callstack?

为什么:每当你不明白异常并知道如何从中恢复时,你应该让它向上传播.

如何:只捕获您了解并知道如何处理的异常类型.有时您需要任何异常的详细信息才能正确恢复.在这种情况下,你可以抓住它,做恢复,然后使用throw重新抛出;声明.

Also,is it ok to insert complex error handling logic in a catch block (e.g. ifs/elses and things like that).

通常是的,因为您的Catch块中的代码引起的任何新异常都将通过InnerException属性自动附加旧的异常.但是如果你能避免这个机制,那么引发这个机制是不明智的,所以你拥有的更简单的代码越好.保持Catch代码简单的另一个好原因是它通常不会经历与您的主线代码相同程度的测试.

c# – 异常处理实践的更多相关文章

  1. xcode – 如何在LLDB断点条件下使用堆栈内容?

    问题:我有一种情况,我们在发布期间有媒体播放,并且objc_exception_throw()在此期间大约有5次点击,但总是被捕获,并且它在媒体播放器对象的南边.我厌倦了(a)必须手动连续n次,或者(b)在播放完成之前必须禁用断点.我尝试过的:>使断点忽略前五次命中(问题:它并不总是正好五次)>使用我的目标作为模块创建我自己的符号断点(问题:没有改变)我想做什么:想到的一个解决方案是在断点命中时评

  2. ios – 如何在Xcode堆栈跟踪中查找NSInternalInconsistencyException的来源

    我没有在此堆栈跟踪中的任何位置看到任何可识别的文件名,方法调用或行号.或者,如果不是简单地读取堆栈跟踪并且涉及其他技术,那么开发人员应该采取哪些适当的下一步来追踪此类错误的来源?

  3. ios – 非常规形状的NSTextContainer示例?

    嗨,我正在使用iOS7的新TextKitAPI,我正在尝试生成一个不规则形状的UITextView.到目前为止,我在视图控制器中:然后在我的子类NSTextContainer中,我想将一个mutablePath绘制为文本容器的形状,但不知道如何实现这一点.我有:对于如何使其工作有点困惑.我找不到具有不规则形状的NSTextContainer的任何示例.解决方法不需要构建TextKit堆栈的所有代码

  4. ios – UINavigationBar -pushNavigationItem在将新控制器推送到UINavigationController堆栈时从不调用

    解决方法我找到了原因:它调用–pushNavigationItem:项不调用–pushNavigationItem:animated!

  5. 阅读iOS Webkit崩溃堆栈跟踪

    b)有没有任何其他见解,任何人都可以看到我得到的堆栈跟踪建议?解决方法我最终根据上面描述的理论进行了代码更改.在做出这些改变之后,我没有看到崩溃再次发生.所以原始理论看起来是正确的.

  6. ios – UICollectionView神秘崩溃

    我有一个UICollectionView,我用从Internet下载的图像填充单元格.为此我使用SDWebImage.我的代码如下所示:我相信我已经正确地设置了它.但应用程序完全随机崩溃,有时会留下此堆栈跟踪:日志区域中没有其他消息.我尝试设置异常断点,但每次发生此崩溃时,都会显示此堆栈跟踪.有谁知道可能是什么问题?解决方法如果有人在寻找答案,我已经解决了问题,并回答了与同一问题有关的另一个问题.你可以找到它here.希望它有所帮助!

  7. ios – 如何在Xcode 7中使用对象库的Stack View

    我最近安装了Xcode7beta并找到了一些东西像对象一样的新对象库水平堆栈视图和垂直堆栈视图.Wheniputsomecontrolsinsideit,stackviewseemstoberesizableaccordingtothecontrolsize.Whenipresentmorecontrolsthestackseemstobeadjustautomaticallyasofthesta

  8. ios – 多个NavigationControllers之间的导航

    (这可以通过我们在常见的VC之间使用segue来实现,我是对的吗?)据我所知,NavigationController代表了一堆ViewControllers,我们可以在其中弹出并推送这些VC.那么现在我们将第一个NavigationController的VC的“位置”从第二个改为VC,接下来会发生什么?如果是这样,是否意味着第一个NavigationController的VC堆栈是否已从内存中删除?

  9. ios – 如何检查viewcontroller是否添加到堆栈中

    我有两个视图控制器.我按下按钮使用下面的代码,从一个视图导航到另一个视图.对于背面,我使用条形按钮上的条形按钮单击后面的代码.所以我的问题是如果我从一个视图连续到另一个视图然后它添加到堆栈中.我想只显示另一个视图,当它已经添加到堆栈中以停止添加它时.它只添加一次.解决方法要检查导航堆栈是否包含特定类型的视图控制器,您可以使用:要从导航堆栈中删除特定控制器,您需要更改导航堆栈.例:

  10. ios – 无法实例化名为ADBannerView的类

    我试图在我的应用程序的底部插入一个iad横幅,但在遵循教程后不断收到错误.代码如下.我一直收到以下错误*由于未捕获的异常’NSInvalidUnarchiveOperationException’终止应用程序,原因:’无法实例化名为ADBannerView的类’*第一次抛出调用堆栈:解决方法请确保您已添加“iAd.framework”…要执行此操作,请转到“App.Target”,“General

随机推荐

  1. c# – (wpf)Application.Current.Resources vs FindResource

    所以,我正在使用C#中的WPF创建一个GUI.它看起来像这样:它现在还没有完成.这两行是我尝试制作一种数据表,它们在XAML中是硬编码的.现在,我正在C#中实现添加新的水果按钮功能.我在XAML中有以下样式来控制行的背景图像应该是什么样子:因此,在代码中,我为每列col0,col1和col2创建一个图像,如果我使用以下代码,它添加了一个如下所示的新行:如你所见,它不太正确……为什么一个似乎忽略了一些属性而另一个没有?

  2. c# – 绑定DataGridTemplateColumn

    似乎我已经打了个墙,试图在DataGrid上使用DataTemplates.我想要做的是使用一个模板来显示每个单元格的两行文本.但是似乎无法以任何方式绑定列.以下代码希望显示我想做的事情.注意每个列的绑定:模板列没有这样的东西,因此,这个xaml不可能工作.我注定要将整个DataTemplate复制到每个列,只是对每个副本都有不同的约束?解决方法我不完全确定你想要做什么,但如果您需要获取整行的DataContext,可以使用RelativeSource绑定来移动视觉树.像这样:

  3. c# – 学习设计模式的资源

    最近我来到了这个设计模式的概念,并对此感到非常热情.你能建议一些帮助我深入设计模式的资源吗?

  4. c# – 是否有支持嵌入HTML页面的跨操作系统GUI框架?

    我想开发一个桌面应用程序来使用跨系统,是否有一个GUI框架,允许我为所有3个平台编写一次代码,并具有完全可脚本化的嵌入式Web组件?我需要它有一个API来在应用程序和网页之间进行交流.我知道C#,JavaScript和一些python.解决方法Qt有这样的事情QWebView.

  5. c# – 通过字符串在对象图中查找属性

    我试图使用任意字符串访问嵌套类结构的各个部分.给出以下(设计的)类:我想要从Person对象的一个实例的“PersonsAddress.HousePhone.Number”获取对象.目前我正在使用反思来做一些简单的递归查找,但是我希望有一些忍者有更好的想法.作为参考,这里是我开发的(crappy)方法:解决方法您可以简单地使用标准的.NETDataBinder.EvalMethod,像这样:

  6. c# – 文件下载后更新页面

    FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true它呈现该页面,然后使用以下元刷新标签来实际向用户提供要下载的文件:你可能需要在你的应用程序中做类似的事情.但是,如果您真的有兴趣在文件完全下载后执行某些操作,那么您的运气不佳,因为没有任何事件可以与浏览器进行通信.执行此操作的唯一方法是上传附件时使用的AJAXupload.

  7. c# – 如何在每个机器应用程序中实现单个实例?

    我必须限制我的.net4WPF应用程序,以便每台机器只能运行一次.请注意,我说每个机器,而不是每个会话.我使用一个简单的互斥体实现单实例应用程序,直到现在,但不幸的是,这样一个互斥是每个会话.有没有办法创建机器互连,还是有其他解决方案来实现每个机器应用程序的单个实例?

  8. c# – WCF和多个主机头

    我的雇主网站有多个主机名,都是同一个服务器,我们只是显示不同的皮肤来进行品牌宣传.不幸的是,在这种情况下,WCF似乎不能很好地工作.我试过overridingthedefaulthostwithacustomhostfactory.这不是一个可以接受的解决方案,因为它需要从所有主机工作,而不仅仅是1.我也看过thisblogpost,但是我无法让它工作,或者不是为了解决我的问题.我得到的错误是“这

  9. c# – ASP.NET MVC模型绑定与表单元素名称中的虚线

    我一直在搜索互联网,试图找到一种方式来容纳我的表单元素的破折号到ASP.NET的控制器在MVC2,3或甚至4中的默认模型绑定行为.作为一名前端开发人员,我更喜欢在我的CSS中使用camelCase或下划线进行破折号.在我的标记中,我想要做的是这样的:在控制器中,我会传入一个C#对象,看起来像这样:有没有办法通过一些正则表达式或其他行为来扩展Controller类来适应这种情况?我讨厌这样的事实,我必须这样做:甚至这个:思考?

  10. c# – 用户界面设计工具

    我正在寻找一个用户界面设计工具来显示文档中可能的GUI.我不能生成代码.我知道MicrosoftVisio提供了一个功能.但有什么办法吗?您使用哪种软件可视化GUI?

返回
顶部