惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

罗磊的独立博客
Cisco Talos Blog
Cisco Talos Blog
C
Check Point Blog
博客园_首页
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Martin Fowler
Martin Fowler
Recorded Future
Recorded Future
S
Security @ Cisco Blogs
L
LINUX DO - 最新话题
博客园 - 司徒正美
P
Privacy International News Feed
G
Google Developers Blog
I
Intezer
Hacker News - Newest:
Hacker News - Newest: "LLM"
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
C
Cybersecurity and Infrastructure Security Agency CISA
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Scott Helme
Scott Helme
K
Kaspersky official blog
I
InfoQ
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
Webroot Blog
Webroot Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
大猫的无限游戏
大猫的无限游戏
D
Docker
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
Microsoft Azure Blog
Microsoft Azure Blog
Spread Privacy
Spread Privacy
量子位
H
Hacker News: Front Page
Simon Willison's Weblog
Simon Willison's Weblog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
SecWiki News
SecWiki News
S
Security Affairs
Latest news
Latest news
人人都是产品经理
人人都是产品经理
C
CERT Recently Published Vulnerability Notes
S
Security Archives - TechRepublic
V
Visual Studio Blog
T
Troy Hunt's Blog
S
Secure Thoughts
F
Fortinet All Blogs
V
V2EX
The Register - Security
The Register - Security
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

博客园 - 王庆

crosstool-ng搭建交叉编译环境注意事项 多重继承及虚继承中对象内存的分布 编写和调试Android下JNI程序流程 eclipse xml文件中按alt+/没有提示信息 Android NDK 工具链的使用方法(Standalone Toolchain) 编译Android VNC Server 使用gdb和gdbserver调试Android C/C++程序 openssl在多平台和多语言之间进行RSA加解密注意事项 LINUX开发使用的3个远程工具 NDK 链接第三方静态库的方法 动态生成程序集和类型 关于线程池的一段代码 理解ParseChildren用法 快速查找ASP.NET产生的临时文件 捕获ASP.NET程序发生的异常 Synchronized vs SyncRoot 【转】Hashtable,ListDictionary,HybridDictionary比较 Monitor用法 C#多线程之Thread
Exception vs ApplicationException
王庆 · 2008-07-13 · via 博客园 - 王庆

在我们平时写的程序的时候,免不了要多程序流程做一些假定,如果条件不满足时,程序有时候需要抛出异常。

我们知道,异常分为两大类,既Exception和ApplicationException。
我们先看看微软给出的解释:Exception表示在应用程序执行期间发生的错误,由公共语言运行库引发。
ApplicatonException发生非致命应用程序错误时引发的异常,由用户程序引发,而不是由公共语言运行库引发。

我相信,很多人看了这种解释都会觉得很迷惑,不禁会提出这样的疑问,什么样的错误才算是致命的错误呢?

在很长时间以来,我是搞不清楚这两者之间有什么区别,在平时写程序的时候,我一直用Exception抛出异常。这几天我正好看Community Server(一下简称CS),在CS系统中,自定义异常处理类。这个自定义的异常处理类继承ApplicationException。我看了一下MSDN,给出了这样的解释:如果打算设计需要创建自己的异常的应用程序,请从 ApplicationException 类派生。ApplicationException 扩展 Exception,但不添加新功能。此异常作为一种区分应用程序定义的异常与系统定义的异常的方法而提供。我特地建了一个Web项目,写了一小段程序,一个抛出Exception异常,一个抛出ApplicationException异常,好像没什么区别嘛。后来仔细想了想,如果程序在运行期间发生致命的错误,应该在系统的“事件查看器”中有记录吧,想到这,我打开系统事件查看器,不出所料,抛出的Exception异常在系统的事件查看器中有记录,而抛出的ApplicationException异常就没有记录。呵呵,原来他们的区别在这啊。

依据以上的描述,我得如下结论:
如果程序本身具备捕获异常并对异常信息做了相应的记录,我们就应该抛出ApplicationException异常。
如果程序将异常的捕获和处理交给CLR,我们就应该抛出Exception,这样我们的程序在错误的时候,在系统的事件查看器中,也有个历史记录可以查看。

在CS系统中,程序本身具备捕获异常并对异常信息做了相应的处理,他的异常处理类继承自ApplicationException就能理解了。