首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

必备 .NET - C# 异常处理

在本期内容中,我将回顾许多变更,并提供更新后的编码指南,因为这些指南与异常处理(即捕获异常)相关。 捕获异常: 回顾 很好理解的是,引发特定的异常类型可以让捕获程序使用异常类型本身来确定问题。...会捕获异常,而不是 catch(Exception...) 块(如果有的话)。 catch 块必须按从最具体到最笼统的顺序显示(同样假设不含 C# 6.0 异常条件),以免出现编译时错误。...常规 catch 块 C# 要求代码引发的所有对象都必须源自 System.Exception。然而,此要求并不通用于所有语言。...然而,在 C# 1.0 之前,如果通过方法调用(驻留在程序集中,而不是在 C# 中编写)引发非源自 System.Exception 的异常,则 catch(System.Exception) 块不会捕获异常...总结 在本文中,我介绍了更新后的异常处理指南(与捕获异常有关),主要是由于过去几个版本中的 C# 和 .NET Framework 改进才需要更新的。

2.4K60
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C Sharp(十六)

    C Sharp(十六) 發佈於 2018-12-01 这一篇,我们讲讲 C# 中的异常处理 —— try、catch、finially。 什么是异常 异常是程序运行时错误,出现正常操作时未预料的情况。...当发生时,系统会捕获这个错误并抛出异常。 在编写 iOS 程序时,我们可能很少使用异常,通常我们使用 NSError **error 这样的二级指针来获取错误对象,处理不同的错误。...try 语句由三部分组成: try 包含为避免出现异常而被保护的代码 catch 是异常处理程序 finally 是在所有情况都会执行的代码块,不论有没有异常 try { //... } catch...BCL 定义了许多异常类。当一个异常发生时,我们应: 创建该类型的异常对象 在适当的 catch 子句处理 所有的异常类都继承自 System.Exception。...,在代码块中可以使用异常对象 } finally 子句 如果程序进入了一个带有 finally 块的 try 语句,那么 finally 块总会执行。

    40630

    C# 基础知识系列- 15 异常处理篇

    我来举几个例子: 程序需要访问一个文件,但这个文件不存在,当程序尝试打开一个读该文件的流时就会出错 成绩管理系统中,成绩需要一个浮点型的数字,但是输入的人错误的输入了其他符号或者用中文输入了成绩 程序需要通过网络与其他服务器进行交互...,但是程序所在计算机没有网了 程序在计算一个数除以另一个数的时候,除数错误的设置为0了 等等,以上都是出现异常的情景。...异常类 C#中,所有异常都继承自System.Exception类,Exception类定义了C#异常应该具有的信息和方法。...)//2 { // } catch//3 { } 声明捕获一个异常,并获取这个异常实例 e 声明捕获一个异常,但不使用这个实例 声明捕获所有异常,不指定捕获的异常,也不获取异常实例 catch...而且,一旦上一个catch了Exception,则之后的catch全都不会起作用。 finally块在异常处理中并不一定需要出现,但是这个块在异常处理中有着特殊的意义。

    95420

    【深入浅出C#】章节 6: 异常处理和调试:异常的概念和处理机制

    一、C# 异常处理机制 1.1 异常类的继承结构 在C#中,异常处理是通过异常类的继承结构来实现的。所有的异常类都是从System.Exception类派生而来的,它是异常类继承结构的根基。...C#中的异常类继承结构如下: System.Exception:是所有异常类的基类,它包含了异常的基本信息,如消息、堆栈跟踪等。...在 InnerMethod() 方法中抛出了一个内部异常,然后在 OuterMethod() 方法中捕获了这个异常,并将其包装成一个外部异常并抛出。...在 Main() 方法中,我们捕获了这个外部异常,并使用 InnerException 属性获取了内部异常的信息。输出将显示外部异常的消息、类型以及内部异常的消息和类型。...在 InnerMethod() 方法中抛出了一个内部异常,然后在 OuterMethod() 方法中捕获了这个异常,并将其包装成一个外部异常并抛出。

    1.1K40

    C#OOP之十 异常机制及其处理

    在C#程序中,语句的开始结束有强制的规定,不能多或少一些符号,毕竟计算机还是基于逻辑判断的机器。常见的语法错误如下: 1) 语句结束少了分号; 2) 类型匹配错误。...从try/catch/finally说起:深入异常机制 深入理解异常机制,需要认真研究try/catch/finally块应用。在C#中针对程序中可能出现的各种异常,主要有如下几种。 1....一个try块后跟一个或多个catch块 Try { 目标代码块 } catch(异常类名1 异常变量名2) { 异常处理代码1 } catch(异常类名2 异常变量名...无效类型转换引发异常 OutOfMemoryException 没有足够内存继续执行程序引发的异常 了解一个异常类的体系,有必要认真学习System.Exception这个基类,其常用属性如下:...n 系统引发异常:在执行C#语句和表达式的过程中,有时会出现一些例外情况,使某些操作无法正常完成,此时就会引发一个异常。对程序来说,这种异常是被动地发生的。

    7800

    .NET----错误和异常处理机制

    异常类   在C#中当出现某个特殊的异常错误条件时,就会创建抛出一个异常对象,这个对象包含有助于跟踪问题的信息。....在该层次中有两个重要的类,他们派生自System.Exception类: SystemException------该类用于通常由.NET允许库抛出的异常,或者由几乎所有的应用程序抛出的异常。...catch块包含的代码处理各种错误,这些错误是执行try块中的代码时遇到的问题。这个快可以用来记录错误。 finally快包含的代码清理资源或执行通常要在try块或者catch块末尾执行的其他操作。...异常处理具有性能含义,在常见的情况下,不应该使用异常处理错误。应尽量编写好避免错误出现的代码。   在异常捕获中,我们可以实现多个catch块来针对不同的错误做出对应的错误处理。...捕获不同的异常类型时,可以有行为不同的代码块。在某些情况下,catch块基于异常的内容执行不同的操作。

    66550

    解析Exception和C#处理Exception的常用方法总结

    System.InvalidCastException 因无效类型转换或显示转换引发的异常。...此搜索将一直进行下去,直到找到可以处理当前异常的 catch 子句(该子句指定一个异常类,它与当前引发该异常的运行时类型属于同一个类或是该运行时类型所属类的一个基类)。...在 catch 子句的执行开始前,系统将首先按顺序执行嵌套在捕捉到该异常的 try 语句里面的所有 try 语句所对应的全部 finally 子句。      ...(2).catch块:包含的是响应一个异常需要执行的代码。如果没有任何捕捉类型与抛出的异常匹配,CLR会去调用栈的更高一层搜索一个与异常匹配的捕捉类型。      ...(程序):对于程序中出现的异常,在C#中是使用一种被称为“异常处理器(程序)”的错误捕获机制来进行处理的, 你可以认为异常处理器(程序)就是发生错误时,能够接受并处理错误的接受者和处理。

    2.3K100

    Java Review(三十二、异常处理)

    如果方法中的任何代码拋出了一个在 catch 子句中没有声明的异常类型,那么这个方法就会立刻退出(希望调用者为这种类型的异常设记了catch 子句。...可以使用 e.getClass().getName() 得到异常对象的实际类型。 在 Java SE 7中,同一个 catch 子句中可以捕获多个异常类型。...一种解决方案是捕获并重新抛出所有的异常,这种解决方案并不完美,这是因为需要在两个地方清除所分配的资源。一个在正常的代码中;另一个在异常代码中。...2 ) 抛出一个在 catch 子句中捕获的异常。在上面的示例中就是 IOException 异常。在这种情况下,程序将执行 try语句块中的所有代码,直到发生异常为止。...如果 catch 子句抛出了一个异常, 异常将被抛回这个方法的调用者。在这里, 执行标注1、 3、 5 处的语句。 3 ) 代码抛出了一个异常, 但这个异常不是由 catch 子句捕获的。

    78810

    关于.NET异常处理的思考

    以上是在实际开发中需要面对的问题,笔者在最近的博文中,也在考虑这个异常到底需要怎么去写,以及异常到底需要怎么去理解,在博文中,也有不少的园友对异常的写法和处理提出了自己的意见,在这里我就写一下自己的一些理解...除非在catch块的末尾重新抛出异常,否则不要处理或捕获System.Exception异常。      ...在异常的处理中,我们可以在一个线程捕获异常,在另一个线程中重新抛出异常。异常抛出时,CLR会在调用栈中向上查找与抛出的异常类型匹配的catch块。...一个try块至少有一个关联的catch块或finall块。               (2).catch块:包含的是响应一个异常需要执行的代码。catch关键字后的圆括号中的表达式是捕获类型。...一旦CLR找到一个具有匹配捕获类型的catch块,就会执行内层所有finally块中的代码,”内层finally“是指抛出异常的tey块开始,到匹配异常的catch块之间的所有finally块。

    92050

    重温《Framework Design Guidelines》

    常见被违反的规范 今年升级一个核心代码从很久以前的代码改写过来的软件,各种不符合C#代码规范的代码让我感到难以维护;去年系统工程师退休前留给我们的一个代码更是让我受到会心一击。...我使用C#多年来见到过很多不规范的代码,于是试着参考书中的规范,列出其中一些来常见的错误以及一些问题。...2.5 异常 不要在框架代码中捕获System.Exception或System.SystemException,除非打算重新抛出。...不要在框架的代码捕获具体类型不确定的异常(比如System.Exception、System.SystemException,等等)时,把错误吞了。...不要正常的控制流中使用异常,如果能够避免的话。 很常见到捕获了System.Exception做跳转分支,以及明明有TryParse却还是用TryCatch的代码。

    1.3K41

    《CLR via C#》笔记:第4部分 核心机制(1)

    (P407 1) 一般在Windows应用程序事件日志或崩溃转储(crash dump)中查看,而非直接访问异常属性。 有System.Exception类型的公共属性 throw抛出异常。...在 catch 块内访问被抛出的异常对象的StackTrace属性,负责实现该属性的代码会调用CLR内部的代码,后者创建一个字符串来指出从异常抛出位置到异常捕捉位置的所有方法。...为了正确回滚已部分完成的操作,代码应捕捉所有异常。在C#中只需要单独使用throw关键字,不在throw后指定任何内容。(P246 last) 隐藏实现细节来维系协定。...(P427 3) 未处理的异常 异常抛出时,CLR在调用栈中向上查找与抛出的异常对象的类型匹配的catch 块。没有任何catch 块匹配抛出的异常类型,就发生一个未处理的异常。...所有这些操作都可能失败,CLR通过抛出异常来报告失败。(P438 3) 代码协定 代码协定(code contract)提供了直接在代码中声明代码设计决策的一种方式。

    77410

    ☀️ 学会编程入门必备 C# 最基础知识介绍(六)——接口、命名空间、预处理指令、正则表达式、异常处理、文件的输入与输出

    条件指令用于在调试版本或编译指定配置时编译代码。一个以 #if 指令开始的条件指令,必须显示地以一个 #endif 指令终止。...异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。 异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。...C# 异常处理时建立在四个关键词之上的:try、catch、finally 和 throw。 try:一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块。...// 要执行的语句 } 可以列出多个 catch 语句捕获不同类型的异常,以防 try 块在不同的情况下生成多个异常。...---- C# 中的异常类 C# 异常是使用类来表示的。C# 中的异常类主要是直接或间接地派生于 System.Exception 类。

    1.4K30

    设计异常解决方案的几点注意事项

    如果用catch语句块捕获了某个特定类型的异常,并完全理解在catch块之后继续执行对应用程序意味着什么,那么我们说这种情况是对异常进行了处理。...× 不要在框架(是指供开发人员使用的程序)的代码中,在捕获具体类型不确定的异常(如System.Exception、System.SystemException)时,把异常吞了。...× 避免在应用程序的代码中,在捕获具体类型不确定的异常(如System.Exception、System.SystemException)时,把错误吞了。...× 不要在为了转移异常而编写的catch代码块中把任何特殊的异常排除在外。 √ 考虑捕获特定类型的异常,如果理解异常产生的原因,并能对错误做适当的反应。...× 避免捕获Exception或SystemException类型的异常,除非是在顶层的异常处理器程序中。

    76290

    Java异常机制的最佳实践

    有了异常处理机制,可以把所有动作都放在 try 块,然后只需在一个地方就可以捕获所有异常。这意味着你的代码将更容易编写和阅读,因为代码的意图和错误检查不是混淆在一起。...精准的重新抛出异常 在 Java 7 前,若遇到异常,则只能重新抛出该类型的异常。这导致在 Java 7 中修复的代码不精确。...主方法中的 catch 子句看起来不同 - 它使用相同的子句处理两种不同类型的异常,并结合“或(|)”符号。...当我意识到犯了这么大一个错误时,简直吓了一大跳,在本书第 2 版中,我在处理程序里通过打印栈轨迹的方法“修补”了这个问题(本章中的很多例子还是使用了这种方法,看起来还是比较合适的),虽然这样可以跟踪异常的行为...这样,就可以用编程的方式在方法签名中声明这个方法将会抛出异常。异常说明有两个目的:一个是“我的代码会产生这种异常,这由你来处理”。另一个是“我的代码忽略了这些异常,这由你来处理”。

    1K30

    Java8编程思想之Java异常机制最佳实践

    有了异常处理机制,可以把所有动作都放在 try 块,然后只需在一个地方就可以捕获所有异常。这意味着你的代码将更容易编写和阅读,因为代码的意图和错误检查不是混淆在一起。...精准的重新抛出异常 在 Java 7 前,若遇到异常,则只能重新抛出该类型的异常。这导致在 Java 7 中修复的代码不精确。...主方法中的 catch 子句看起来不同 - 它使用相同的子句处理两种不同类型的异常,并结合“或(|)”符号。...当我意识到犯了这么大一个错误时,简直吓了一大跳,在本书第 2 版中,我在处理程序里通过打印栈轨迹的方法“修补”了这个问题(本章中的很多例子还是使用了这种方法,看起来还是比较合适的),虽然这样可以跟踪异常的行为...这样,就可以用编程的方式在方法签名中声明这个方法将会抛出异常。异常说明有两个目的:一个是“我的代码会产生这种异常,这由你来处理”。另一个是“我的代码忽略了这些异常,这由你来处理”。

    1.2K20

    框架设计原则和规范(三)

    不要在异常过滤程序(exception filter)中抛出异常 C#不支持异常过滤程序 2.1.11. 避免显示的从finally代码块中抛出异常。...错误消息的设计 在异常中携带的文本信息 对于已经处理的异常,异常消息并没什么用,只有当异常未被处理的时候它们才能发挥作用。因此错误消息的目的应该是帮助开发人员修正代码的错误,而不是给最终用户看。...避免在应用程序的代码中,在捕获具体类型不确定的异常时,把错误吞了 2.2.9.3....考虑捕获特定类型的异常——如果确实理解该异常在具体环境中产生的原因,并能对错误做出适当的反应 应该只有在你知道自己能从一个异常中完全恢复时,才捕获该异常。...不要在框架代码中捕获System.Exception或System.SystemException异常,除非打算重新抛出 2.3.1.3.

    99960

    一文看懂 .NET 的异常处理机制、原则以及最佳实践

    什么时候该抛出异常,抛出什么异常?什么时候该捕获异常,捕获之后怎么处理异常?你可能已经使用异常一段时间了,但对 .NET/C# 的异常机制依然有一些疑惑。那么,可以阅读本文。...本文适用于已经入门 .NET/C# 开发,已经开始在实践中抛出和捕获异常,但是对 .NET 异常机制的用法以及原则比较模糊的小伙伴。...举一个例子:我们写一个程序有简洁模式和专业模式,在从简洁模式切换到专业模式的时候,我们设置 IsProfessionalMode 为 true,但随后出现了异常导致没有成功切换为专业模式;然而接下来所有的代码在执行时都判断...当然如果任务已全部完成,仅仅在对外通知的时候出现了异常,那么这个时候不需要恢复状态,因为实际上已经完成了任务。 你可能会有些担心如果我没有任何手段可以恢复错误怎么办?那这个时候就不要处理异常!...中获取比较完整的异常堆栈) 注意第一次机会异常事件即便异常会被 catch 也会引发,因为它引发在 catch 之前 不要认为异常已经被 catch 就万事大吉可以无视这个事件了。

    88241

    JavaSE(十一)之异常处理详解

    在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。     Java异常层次结构图: ?         ...若有一个catch语句匹配到了,则执行该catch块中的异常处理代码,就不再尝试匹配别的catch块了。     ...处理这种情况,我们需要定义两个或者更多的catch子句,每个子句捕获一种类型的异常,当异常被引发时,每个catch子句被依次检查,               第一个匹配异常类型的子句执行,当一个catch...一个throws子句列举了一个方法可能引发的所有异常类型。这对于除了Error或RuntimeException及它们子类以外类型的所有异常是必要的。...一个方法可以引发的所有其他类型的异常必须在throws子句中声明,否则会导致编译错误。

    1.3K90

    编程思想 之「异常及错误处理」

    在 Java 的异常及错误处理机制中,用Throwable这个类来表示可以作为异常被抛出的类。...,在超类Throwable中提供了一个printStackTrace()方法,该方法打印Throwable的调用栈轨迹,调用栈显示了“把你带到异常抛出点”的方法调用序列。...有的时候,在我们捕获到异常后并没有很好的处理方式,因此需要重新抛出异常,把异常交给上一级环境中的异常处理程序来处理,这时,位于同一个try块的后续catch子块将被忽略。...在 Java 标准异常体系中,有一个特例,那就是RuntimeException及其所有子类型异常。...此外,一个出现在基类方法的异常说明中的异常,不一定会出现在派生类方法的异常说明里。 最后,在catch子句查找异常类型的时候,并不要求抛出的异常同处理程序所声明的异常完全匹配。

    1.5K60
    领券