1 异常
异常是程序中的运行时错误,当错误发生时,系统会捕获这个错误并抛出一个异常。
如果程序没有提供处理该异常的代码,系统会挂起这个程序。
1.1 try
语句
try
语句用来指明为避免出现异常而被保护的代码段,并在发生异常时提供代码处理异常,try
语句由三个部分组成:
try
块:为了避免 出现异常 而被保护的代码catch
子句:含有处理try
块抛出异常的处理代码finally
子块:无论在try
块中有没有抛出异常都要执行的代码
finally
块与catch
子句二者必须有一个
1.1.1 异常类
BCL定义了很多异常类,每个类代表一个指定的异常类型,当一个异常错误发生,CLR会创建该类型的异常对象,然后寻找适当的 catch
子句处理它,所有的异常类都派生自 System.Exception
类。
异常对象含有只读属性,带有导致该异常的信息:
Message
:类型是string,含有解释异常原因的信息StackTrace
:类型是string,含有描述异常发生在何处的信息InnerException
:类型是Exception(即异常类型),如果当前异常是由另一个异常引起,那么这个属性包含前一个异常的引用HelpLink
:类型是string,该属性值可以被 应用程序定义的异常 设置,为异常信息提供 URN 或 URLSource
:类型是string,如果没有被 应用程序定义的异常 设置,那么该属性含有异常所在的程序集的名称
1.1.2 catch
子句
catch
子句有三个形式,允许不同级别的处理:
- 一般
catch
子句:在catch
关键字后没有任何参数列表,能匹配try
块中引起的所有类型的异常 - 特定
catch
子句:带有异常类的名称作为单一参数,匹配任何该名称类型的异常 - 带对象 的
catch
子句:引入了该异常对象,可以访问该对象的属性信息
1.2.3 抛出异常
使用 throw
语句可以显式地引发出一个异常,语法:
throw ExceptionObject;
在 catch
子句中直接使用 throw
语句后面不跟附加参数 ExceptionObject
对象,那么就会重新抛出 try
块中的异常。
2 预处理指令
源代码指定了程序的定义,而预处理指令则指示了编译器如何处理源代码
使用预处理指令需要注意的是:
- 预处理指令必须与C#代码在不同的行
- 预处理指令无需使用分号结尾
- 预处理指令每一行必须使用
#
字符开始 - 允许行尾注释,不允许分隔符注释
下面列出预处理指令:
#define identifier
:定义编译符#undef identifier
:取消定义编译符#if expression
:如果表达式是true
,则编译下面的片段#elif expression
#else
#endif
:只要有#if
语句就要有#endif
语句#region name
:标记一段代码的开始,没有编译效果#endregion name
:标记一段代码的结束#warning message
:显示编译时的警告信息#error message
:显示编译时的错误信息#line indicator
:修改在编译器消息中显示的行数#pragma text
:指定有关程序上下文的信息
2.1 #define
和 #undef
指令
编译符号是只有两种可能的状态,要么被定义,要么未被定义。
#define
指令声明一个编译符号,#undef
指令取消一个定义编译符号。
#define
与 #undef
指令都只能在源文件的第一行,也就是在所有C#代码之前,此时重复声明同一个编译符号也是允许的。
2.2 条件编译
条件编译允许我们根据某个编译符号是否被定义而标注当前的代码是被编译还是跳过。
2.3 诊断指令
诊断指令产生用户自定义的编译时警告及错误信息。警告及错误信息与普通的C#字符串不同,它们不需要引号包围。
#error Message
#warning Message
当编译器遇到诊断指令时,它会输出相关的信息,诊断指令的信息会与任何编译器产生的警告和错误信息列在一起。
2.4 行号指令
行号指令可以做很多事,如:
- 改变由编译器警告和错误信息报告的出现函数
- 改变被编译源文件的文件名
- 对交互式调节器隐藏一些行
#line
指令语法如下:
#line integer
:设置下一行的整数行号值#line "fileName"
:设置源文件的文件名,双引号是必须的#line default
:重新保存实际、真实的行号和文件名#line hidden
:断点测试中隐藏代码#line
:终止断点测试隐藏代码
2.5 区域指令
区域指令允许我们标注和有选择性地命名一段代码,使用 #region
指令后,一定要使用 #endregion
指令表示终止,编译器会忽略区域指令,它是作用与源代码工具的,比如Visual studio可以利用它很简单地隐藏或显示区域。
例如:
#region Constructors
MyClass ()
{
...
}
#endregion
2.6 pragma warning
指令
#pragma warning
指令允许我们关闭及重开警告消息,
- 关闭警告消息,使用
disable
加上逗号分隔的关闭警告数列表 - 重启警告消息,使用
restore
加上逗号分隔的开启警告数列表
eg:
#pragma warning disable 618, 1111
...
#pragma warning restore 618