首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C# (不是ASP/MVC/WinForms) -捕获类中的所有异常

C# (不是ASP/MVC/WinForms) -捕获类中的所有异常
EN

Stack Overflow用户
提问于 2011-07-07 05:18:18
回答 3查看 2.3K关注 0票数 21

一些背景信息

我是在一个使用专有编程语言的系统中编程,可以选择在专有代码中使用特别属性化的.Net类。

不幸的是,如果事实并非如此,系统无法很好地处理从.Net代码中冒出来的未处理异常;系统崩溃,没有任何解释。这很烦人,因为我们通常希望在专有系统中处理异常,而不是在.Net代码中。系统供应商提供的解决方案是将异常重新打包到系统处理的特殊对象中。

我们的.Net代码是以外观模式编写的,问题是,为了确保处理从.Net代码中出现的每个异常,外观中的每个方法都必须包括一个try/catch块,该块重新打包可能发生的任何异常。

问题是

我在这里读过很多描述类似场景的线程,其中大多数都是与WinForms或web相关的。因为我们的代码都不是,所以问题是是否有办法捕获类中的所有异常,这样我们就可以重新打包它并重新抛出它们的修改版本?

显然,包含类和专有语言的.Net dll之间的接口完全超出了我们的控制范围。

编辑

我尝试了@VMAtm建议的currentDomain.UnhandledException方法,但不幸的是没有效果。事件处理程序没有触发,父系统控制了异常,然后就像往常一样不正常。这使我再次进入Google,我发现了这段这里

首先要理解的是,UnhandledException事件不是一个未处理的异常“处理程序”。注册事件,与文档所述相反:-(不会导致处理未处理的异常。(从那时起,他们将不会被忽视,但我将停止循环推理.)UnhandledException事件只是通知您一个异常未被处理,以防您想要在线程或应用程序死前保存状态。 Jonathan,CLR异常PM

那太糟糕了,我喜欢“全局”的尝试/捕捉块的想法。我猜这意味着我没有成功地向父系统隐藏异常。因为我不知道这是如何在那个系统中实现的第一件事(坦白地说,我也不知道第一件事情是如何自己实现的),所以我的假设非常有限,所以如果有人可以在任何方面纠正我,请继续!

哦,我在父系统中遇到的错误是Exception has been thrown by the target of an invocation.,据我所知,这是来自外部.Net异常的消息。如果有可能的话,我不知道。

我也将使用@jlew建议的,但是它看起来比两个AppDomain行要难得多,我非常害怕:)

解决方案

如果您遇到了与我相同的问题,那么您应该首先尝试@VMAtm建议的currentDomain.UnhandledException方法,因为这是因为我的父系统特别糟糕--它没有工作。

我通过使用城堡DynamicProxy设置实现了它的工作。建立起来真的很容易。我的测试用例是封装XmlAttribute类的fa类。我要做的第一件事是编写代理类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class AttribInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        try
        {
            invocation.Proceed();
        }
        catch (Exception e)
        {
            // Custom exception repackaging here
        }
    }
}

然后,我必须指示fa对象实际使用代理。我保留了我以前的后端字段,但在C‘to中添加了以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CapXmlAttribute : CapPmlNetObject
{
    private XmlAttributeBackend _xmlAttribute;

    public CapXmlAttribute()
    {
        var generator = new ProxyGenerator();
        _xmlAttribute = (XmlAttributeBackend) generator.CreateClassProxy(
            typeof (XmlAttributeBackend), new AttribInterceptor());
    }
}

最后一步是将暴露在外观中的后端中的所有方法设置为virtual。这对我来说没什么问题,但对其他人来说可能是个大麻烦。

DynamicProxy确实不是很好的文档,但是我从Koź麦克风教程Hamilton Verissimo码工程那里学到了很多。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-07 05:23:49

我想看看如何使用类似于城堡动态代理的东西。

这将允许您的类方法调用以一般方式被截获,这将为您提供一个放置“所有捕获”异常处理程序的中心位置。(尽管如此,我不清楚您的类是如何实例化的,这可能会使这种方法成为问题)

票数 4
EN

Stack Overflow用户

发布于 2011-07-07 05:30:09

正如我所理解的,您需要捕获并重新抛出未处理的异常,对吗?可以为AppDomain.UnhandledException事件添加处理程序。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  AppDomain currentDomain = AppDomain.CurrentDomain;
  currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);

  static void MyHandler(object sender, UnhandledExceptionEventArgs args)
  {
        Exception e = (Exception) args.ExceptionObject;
        // handle exception here, you can easily package exceptions there.
  }

更新:

我在AppDomain类中发现了另一个事件,AppDomain.FirstChanceException事件

在运行库搜索应用程序域中的异常处理程序之前,在托管代码中抛出异常时发生。

也许这可以解决您的问题-这个事件发生在之前,catch块中的任何代码。

票数 11
EN

Stack Overflow用户

发布于 2011-07-07 05:38:47

除了VMAtm的文章之外,还可以为ThreadExceptions设置事件处理程序

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6611215

复制
相关文章
asp net mvc 全局捕获异常的方法
在一个网站的开发测试阶段,我们经常需要全局捕获异常。使得网站在异常发生时并不会整个崩掉,从而影响到所有用户的访问,同时记录下异常的详细信息,以便于网站维护人员在异常发生后,可以准确定位异常所在位置和原因。本文使用过滤器的方式来实现全局异常捕获。网上也有很多类似的博文教程,我这里整理了一份日志打印比较完整的。
全栈程序员站长
2022/09/15
4920
【Python】异常处理 ③ ( 捕获所有类型的异常 | 默认捕获所有类型异常 | 捕获 Exception 异常 )
使用 try-except 语句 , 不指定异常类型 , 默认就可以捕获所有类型的异常 ;
韩曙亮
2023/10/11
2.1K0
【Python】异常处理 ③ ( 捕获所有类型的异常 | 默认捕获所有类型异常 | 捕获 Exception 异常 )
C# 异常捕获
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:C# 异常捕获 ---- C# 异常捕获 1.编译错误与运行错误 2.进行异常捕获 ---- 1.编译错误与运行错误 在编写程序时,编译器会帮我们检查程序是否有错误,当我们改正之后,程序就可以编译了,通常也能够正常运行。 让我们来看看下面这段代码: using System; namespace C
小嗷犬
2022/11/15
1.3K0
springboot中全局异常捕获类的写法
全局异常捕获:      当你访问页面出错时,默认是400或500以   及以一大串英文,自己写了全局异常捕获 类就可以在显示自己写的内容。   写法如下:  图片发自简书App 这样在页面
贪挽懒月
2018/05/18
1.8K0
Python捕获所有异常
老生常谈了,但是在Pyflake检查出E722错误时有时候又犯老毛病。人年纪大了越来越有老年痴呆倾向 -_- …..
happy123.me
2019/12/30
3.6K0
Python 怎么捕获警告?(注意:不是捕获异常)
在前面我们介绍了如何在python中使用try except语句来测试代码。try except语句其实只能捕获异常或者错误,但无法捕获警告。在本文中,我向大家介绍几种捕获警告的方法。
自学气象人
2022/11/14
1.8K0
Python 怎么捕获警告?(注意:不是捕获异常)
Python 怎么捕获警告?(注意:不是捕获异常)
你是不是经常在使用一些系统库或者第三方模块的时候,会出现一些既不是异常也不是错误的警告信息?
青南
2021/03/22
2.9K0
Python 怎么捕获警告?(注意:不是捕获异常)
用Exception类捕获所有异常的技术是怎么用的?
马克-to-win:注意,一个事实是:Exception类是所有其他异常类的父类,所以Exception类能捕获所有的异常。马克-to-win:问题是用Exception来捕获所有的异常,这个技术有什么好处和缺点?好处就是:不管发生什么异常,都能进入Exception catch块儿,这样,程序都不崩溃。马克-to-win:缺点就是:不能根据特定的异常做特定的处理。马克-to-win:比如,对于以上例子,我们可以用以下的技术,Exception来捕获所有的异常,都可以达到程序不崩溃的目的。马克-to-win:因为Exception是所有其他异常的父类。
马克java社区
2021/04/07
4900
用Exception类捕获所有异常的技术是怎么用的?
C# WinForm捕获全局异常
static class Program      {          /// <summary>          /// 应用程序的主入口点。          /// </summary>          [STAThread]          static void Main()          {              try              {                  //设置应用程序处理异常方式:ThreadException处理             
跟着阿笨一起玩NET
2018/09/18
2.3K0
C# WinForm捕获全局异常
C# WinForm捕获全局异常
网上找的C# WinForm全局异常捕获方法,代码如下: static class Program { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { try { //设置应用程序处理异常方式:ThreadExceptio
跟着阿笨一起玩NET
2020/07/27
1.2K0
python中的异常捕获
无论是编程新手还是老手,都会遇到过程序报错,终止执行的情况,对于python的报错信息,可以分为以下两大类
生信修炼手册
2020/05/28
1.9K0
asp.net web api 异常捕获
1 向客户端发送错误消息 使用throw new HttpResponseException()向客户端抛出错误信息。 HttpResponseException包含两个重载的构造函数,其中一个是构造函数参数类型为HttpResponseMessage,通过其设置状态码,错误消息短语以及消息体内容来向客户端抛出比较详细的错误信息。另一个参数类型为HttpStatusCode,只能设定状态码。 2自定义异常过滤器 扩展IExceptionFilter来定义异常过滤器。异常过滤器不会捕获类型为HttpRespo
甜橙很酸
2018/03/08
1.7K0
创建API服务最小只要4行代码!!!尝新体验ASP.NET Core 6预览版本中的最小Web API(minimal APIS)新特性
本文首发于《创建API服务最小只要4行代码!!!尝新体验ASP.NET Core 6预览版本中的最小Web API(minimal APIS)新特性》
Rector
2021/08/19
5.3K0
创建API服务最小只要4行代码!!!尝新体验ASP.NET Core 6预览版本中的最小Web API(minimal APIS)新特性
Flask中异常捕获
HTTP 异常主动抛出 abort 方法 抛出一个给定状态代码的 HTTPException 或者 指定响应,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)。 参数: code – HTTP的错误状态码 # abort(404) abort(500)   抛出状态码的话,只能抛出 HTTP 协议的错误状态码  捕获错误 errorhandler 装饰器 注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法 参数: code_or_ex
汪凡
2019/03/01
1.7K0
ASP.NET MVC HtmlHelper类
ASP.NET MVC之 HtmlHelper 在ASP.NET MVC项目的开发中,一般会默认使用Razor视图来进行View层的编写,从而实现高效率的C#/HTML代码的混写。 示例 诸如下述代码
李郑
2018/03/01
1.8K0
ASP.NET MVC HtmlHelper类
Unity手游崩溃异常如何捕获--C#及JVM捕获
C#脚本未捕获的异常,与Android和Native未捕获异常很大的区别是,未捕获异常不会照成引用的闪退。所以,C#脚本的异常危害相对较小,但是同样更加容易存在在游戏中。闪退问题能够及时发现并进行修复。C#脚本异常,抛出的时机不同,危害性也有所不同; 在Start、Awake等函数抛出的异常,会造成Update、OnGUI无法正常运行,游戏可能表现为无响应、图片确实等。Update、OnGUI的异常也一定会引起游戏逻辑及画面上的一些异常。
WeTest质量开放平台团队
2018/10/29
4.4K0
Python异常捕获及自定义异常类
异常是一个与业务逻辑无关的BUG,一个潜在错误或者网络错误事件等,如:尚未实现的函数,缩进错误,Python语法错误等.该事件可能会在程序执行过程中发生,影响程序的正常执行.
Python碎片公众号
2021/02/26
1.4K0
Python异常捕获及自定义异常类
Python编程思想(33):异常类与多异常捕获
当 Python解释器接收到异常对象时,如何为该异常对象寻找 except块呢?注意到前面的代码中的except块,这个块是专门用于处理该异常类及其子类的异常实例。
蒙娜丽宁
2020/07/08
7890
IdentityServer4入门
IdentityServer4是用于ASP.NET Core的OpenID Connect和OAuth 2.0框架。
鱼找水需要时间
2023/02/16
7.8K0
[javaSE] 异常捕获
异常:程序在运行时出现的不正常现象 Throwable |——Error |——Exception 严重级别:Error类和Exception类 异常的处理:try{}catch{}finally{} public class VariableDemo { /** * @param args */ public static void main(String[] args) { try { System.out.println(1
唯一Chat
2019/09/10
1.5K0

相似问题

ASP.NET C#捕获类中的所有异常

50

在ASP.NET MVC + Web中捕获所有异常

11

MVC Winforms c#空引用异常

21

WinForms和Asp类库中的异常处理

40

捕获类中的所有异常

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文