`
isiqi
  • 浏览: 16704897 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

C#引发异常

阅读更多

当你必须捕获异常时,其他人首先必须首先能够引发异常。而且,不仅其他人能够引发,你也可以负责引发。其相当简单:

throw new ArgumentException("Argument can't be 5");

你所需要的是throw 语句和一个适当的异常类。我已经从表7.1提供的清单中选出一个异常给这个例子。

表 7.1 Runtime提供的标准异常

异常类型 描述

Exception 所有异常对象的基类
SystemException 运行时产生的所有错误的基类
IndexOutOfRangeException 当一个数组的下标超出范围时运行时引发
NullReferenceException 当一个空对象被引用时运行时引发
InvalidOperationException 当对方法的调用对对象的当前状态无效时,由某些方法引发
ArgumentException 所有参数异常的基类
ArgumentNullException 在参数为空(不允许)的情况下,由方法引发
ArgumentOutOfRangeException 当参数不在一个给定范围之内时,由方法引发
InteropException 目标在或发生在CLR外面环境中的异常的基类
ComException 包含COM 类的HRESULT信息的异常
SEHException 封装win32 结构异常处理信息的异常

然而,在catch语句的内部,你已经有了随意处置的异常,就不必创建一个新异常。可能在表7.1 中的异常没有一个符合你特殊的要求——为什么不创建一个新的异常?在即将要学到小节中,都涉及到这两个话题。

7.3.1 重新引发异常

当处于一个catch 语句的内部时,你可能决定引发一个目前正在再度处理的异常,留下进一步的处理给一些外部的try-catch 语句。该方法的例子如 清单7.8所示。

清单 7.8 重新引发一个异常

1try
2{
3checked
4{
5for(;nCurDig <=nComputeTo; nCurDig++)
6nFactorial *=nCurDig;
7}

8}

9catch(OverflowException oe)
10{
11Console.WriteLine("Computing {0} caused an overflow exception", nComputeTo);
12throw;
13}

注意,我不必规定所声明的异常变量。尽管它是可选的,但你也可以这样写:
throw oe;
现在有时还必须留意这个异常。

创建自己的异常类

尽管建议使用预定义的异常类,但对于实际场合,创建自己的异常类可能会方便。创建自己的异常类,允许你的异常类的使用者根据该异常类采取不同的手段。

在清单 7.9 中出现的异常类 MyImportantException遵循两个规则:第一,它用Exception结束类名。第二,它实现了所有三个被推荐的通用结构。你也应该遵守这些规则。

清单 7.9 实现自己的异常类 MyImportantException

1usingSystem;
2
3publicclassMyImportantException:Exception
4{
5publicMyImportantException():base() {}
6
7publicMyImportantException(stringmessage):base(message) {}
8
9publicMyImportantException(stringmessage, Exception inner):base(message,inner) {}
10}

11
12publicclassExceptionTestApp
13{
14publicstaticvoidTestThrow()
15{
16thrownewMyImportantException("something bad has happened.");
17}

18
19publicstaticvoidMain()
20{
21try
22{
23ExceptionTestApp.TestThrow();
24}

25catch(Exception e)
26{
27Console.WriteLine(e);
28}

29}

30}

正如你所看到的,MyImportantException 异常类不能实现任何特殊的功能,但它完全基于System.Exception类。程序的剩余部分测试新的异常类,给System.Exception 类使用一个catch 语句。

如果没有特殊的实现而只是给MyImportantException定义了三个构造函数,创建它又有什么意义呢?它是一个重要的类型——你可以在catch语句中使用它,代替更为普通的异常类。可能引发你的新异常的客户代码可以按规定的catch代码发挥作用。

当使用自己的名字空间编写一个类库时,也要把异常放到该名字空间。尽管它并没有出现在这个例子中,你还是应该使用适当的属性,为扩展了的错误信息扩充你的异常类。

7.4 异常处理的“要”和“不要


作为最后的忠告之语,这里是对异常引发和处理所要做和不要做的清单:


。当引发异常时,要提供有意义的文本。
。要引发异常仅当条件是真正异常;也就是当一个正常的返回值不满足时。
。如果你的方法或属性被传递一个坏参数,要引发一个ArgumentException异常。
。当调用操作不适合对象的当前状态时,要引发一个 InvalidOperationException异常。
。要引发最适合的异常。
。要使用链接异常,它们允许你跟踪异常树。
。不要为正常或预期的错误使用异常。
。不要为流程的正常控制使用异常。
。不要在方法中引发 NullReferenceException或IndexOutOfRangeException异常。

分享到:
评论

相关推荐

    C#异常处理PPT

    C#异常处理PPT 第14章 异常处理 异常和异常处理 C#中的异常处理结构 异常的传播与处理 主动引发异常 使用异常的原则和技巧

    C#异常抛出和排序功能

    根据给定的信息,本文将详细解析“C#异常抛出和排序功能”这一主题,包括如何在C#中显式地引发异常以及实现数组的排序。 ### C#中的异常处理 #### 异常概述 异常是在程序运行时发生的错误或意外情况。C#提供了强大...

    C#中的异常

    使用`try-catch`块可以捕获可能引发的异常。在`try`块中编写可能会抛出异常的代码,而在`catch`块中处理这些异常。例如: ```csharp try { // 有可能抛出异常的代码 } catch (ArgumentNullException ex) { ...

    C#教你使用异常处理

    - **try**:此关键字用于标记可能引发异常的代码块。当try块中的代码引发异常时,控制将传递给与之相关的catch块。 - **catch**:用于捕获并处理try块中引发的异常。一个try块可以跟随一个或多个catch块,每个catch...

    c#异常含异常格式,抛出异常和自定义异常

    // 可能会引发异常的代码 } catch (ExceptionType ex) { // 处理异常的代码 Console.WriteLine("发生了一个" + ex.GetType().Name + "异常:" + ex.Message); } finally { // 无论是否发生异常,都会执行的清理...

    Emgu.CV.CvInvoke的类型初始值设定项引发异常--解决办法.doc版下载

    在使用过程中,有时会遇到“Emgu.CV.CvInvoke的类型初始值设定项引发异常”的错误,这通常是因为缺少必要的DLL文件或者系统环境变量未正确配置导致的。Emgu CV是一个将开源计算机视觉库OpenCV封装为.NET框架的库,...

    C# Sdcb.PaddleInference 中文分词、词性标注.rar

    标题 "C# Sdcb.PaddleInference 中文分词、词性标注.rar" 涉及的是在C#编程环境中使用Sdcb.PaddleInference库进行中文文本的分词和词性标注任务。这一过程是自然语言处理(NLP)中的基础步骤,对于理解和分析中文...

    C# 捕获异常

    `try`块是异常处理的基础,其中包含可能引发异常的代码。如果在`try`块内的代码执行过程中遇到异常,控制将立即跳转到相应的`catch`块。 #### catch块 `catch`块用于捕获并处理由`try`块抛出的异常。每个`catch`块...

    基于C#和Paddle Inference 部署PaddlePaddle模型,C#平台调用Paddle Inference

    近几年以来 ,C#语言快速发展,并跻身于编程语言排行榜前几名的位置,为了能够在C#语言中调用Paddle Inference模型推理库,根据C++动态链接库的原理,推出PaddleInferenceSharp,实现直接在C#平台调用Paddle ...

    C#异常插入日志文件

    - `ex.Source`:获取引发异常的应用程序或对象名称。 - `ex.StackTrace`:获取调用堆栈跟踪信息,用于定位出错位置。 - `ex.TargetSite`:获取引发异常的方法名。 #### 三、日志文件处理 1. **日志文件路径确定...

    详解C#编程中异常的创建和引发以及异常处理

    总结来说,C#中的异常处理是通过创建异常对象、使用`throw`关键字引发异常、并使用`try-catch-finally`结构来捕获和处理异常。理解并熟练运用这些机制能帮助开发者编写更健壮、更易于调试的代码。正确处理异常不仅...

    C#开发的程序可以不用安装Oracle安户端

    “System.Data.OracleClient.OracleConnection”的类型初始值设定项引发异常 在网上搜了一下,说是System.Data.OracleClient的问题,由于机器少没法验证。有兴趣的朋友下载帮我验证一下。 另:数据库没有提供,...

    C#实验报告( 实验四 异常处理编程练习 ).doc

    异常是在程序执行过程中发生的非正常情况,可能是由于逻辑错误、用户输入不合法或资源不足等原因引发的。在C#中,异常处理是通过try-catch块来实现的,它允许程序员预先设定程序在遇到错误时的行为,从而提高程序的...

    c#10 中文文档 C#最新语法

    * 创建和引发异常 * 编译器生成的异常 * 编码样式和标识符名称 * C# 编码约定 面向对象的编程 * 对象和继承 * 多形性和功能技术 * 模式匹配和泛型 * 面向对象的编程概述 * 对象、继承和多形性 并发编程 * 异步...

    C#中的异常处理

    传统的错误处理方法,如使用if语句,虽然能处理一些简单的错误情况,但在面对复杂的错误检测时显得力不从心,特别是在涉及数学运算或资源管理等可能引发异常的操作中。 5.2 捕获处理异常 C#提供了一套结构化的异常...

    C#异常处理.docx

    `try`块包含了可能引发异常的代码。一旦在`try`块内发生异常,控制将立即转移到相应的`catch`块。 ##### 2. `catch`块 `catch`块用于捕获并处理异常。多个`catch`块可以根据不同类型的异常进行不同的处理。 - **...

    QT32-C# 语法全解读书笔记集, 包括C#枚举、C#数组、C#异常、C#转换等

    C#支持多种类型的转换,包括隐式转换(编译器自动进行,不会丢失数据)和显式转换(可能需要用户手动调用转换方法,如`Convert.ToInt32()`,可能会丢失数据或引发异常)。例如,从`double`到`int`的转换是显式的: ...

    C# 记录异常Log的程序实例

    // 某些可能引发异常的操作 } catch (Exception ex) { logger.Error(ex, "在执行操作时发生错误"); } ``` 通过以上代码,我们已经创建了一个基本的`LogHelper`类,能够记录不同级别的日志,包括异常信息。在实际...

    “Emgu.CV.CvInvoke”的类型初始值设定项引发异常。错误时导入这个倒解决方案,属性设置成生成到目标文件夹就可以了

    在使用Emgu.CV库进行计算机视觉开发的过程中,可能会遇到标题中提到的问题——“Emgu.CV.CvInvoke”的类型初始值设定项引发异常。这通常是因为缺少必要的依赖库或者配置不正确导致的。Emgu.CV是C#的一个OpenCV封装库...

    C#异常处理与预处理

    - **Source**: 只读字符串,标识引发异常的应用程序或对象,有助于定位问题来源。 - **StackTrace**: 只读字符串,记录了异常发生时的调用堆栈信息,对于调试至关重要。 - **TargetSite**: 只读`MethodBase`对象,...

Global site tag (gtag.js) - Google Analytics