C#编程.异常处理(Exception Handling Statements)
C#语言包含结构化异常处理(Structured Exception Handling,SEH)。
throw
The throw statement is used to signal the occurrence(发生) of an anomalous(异常) situation (exception) during the program execution.
Remarks
The thrown exception is an object whose class is derived from System.Exception, as shown in the following example.
class MyException : System.Exception {}
// ...
throw new MyException();
Usually the throw statement is used with try-catch or
try-finally statements. A throw statement can be used in a catch block to re-throw the exception that the
catch block caught. In this case, the throw statement does not take an exception operand. For more information and examples, see
try-catch (C# Reference) and How to: Explicitly Throw Exceptions.
try-catch
The try-catch statement(语句) consists of a try block fllowed by one or more catch clauses(子句),which specify handles for different exceptions.
Remarks
When an exception is thrown, the common language runtime (CLR) looks for the
catch statement that handles this exception. If the currently executing method(当前方法) does not contain such a
catch block, the CLR looks at the method that called the current method(调用当前方法的方法), and so on up the call stack. If no
catch block is found, then the CLR displays an unhandled exception message to the user and stops execution of the program.
The try block contains the guarded code(被保护代码) that may cause the exception. The block is executed until an exception is thrown or it is completed successfully. For example, the following attempt(尝试) to cast a
null object(赋值一个null对象) raises(引起) the NullReferenceException exception:
object o2 = null;
try
{
int i2 = (int)o2; // Error
}
Although the catch clause(子句) can be used without arguments to catch any type of exception, this usage is not recommended(不推荐这种用法). In general, you should only catch those exceptions that you know how to recover from(在大多数时候,你应该捕获你知道怎样处理的异常).
Therefore, you should always specify an object argument derived from(派生于) System.Exception .For example:
catch (InvalidCastException e)
{
}
It is possible to use more than one specific catch clause in the same try-catch statement. In this case, the order of the
catch clauses(catch子句的顺序) is important because the catch clauses are examined in order(按顺序检查). Catch the more specific exceptions before the less specific ones(把一般的错误放在特殊的错误之前). The compiler produces an error if you order your
catch blocks so that a later block can never be reached(如若你那样安排你catch子句的顺序,因为后面的catch永远到达不到,所以编译器会产生一个错误).Using
catch arguments is one way to filter for the exceptions you want to handle(使用catch参数是一种过滤你要处理的错误的方式).
Exception filters are preferable(最好) to catching and rethrowing (explained below) because filters leave the stack unharmed. If a later handler dumps the stack, you can see where the exception originally came from(你可以看见错误在哪里产生的), rather than just the last
place it was rethrown(而不仅仅是在哪里抛出的). A common use of exception filter expressions is logging(一种最经常的用法是在日志上面). You can create a predicate function that always returns false that also outputs to a log(你可以创建一个函数,专门利用返回的错误信息生成日志), you can log exceptions as they
go by without having to handle them and rethrow(你可以不马上处理和抛出,可以把异常都存入日志中).
A throw statement can be used in a catch block to re-throw the exception that is caught by the
catch statement(一个throw语句可以被用在catch块中去抛出被catch块捕捉的的异常). The following example extracts source information from an
IOException exception, and then throws the exception to the parent method.
catch (FileNotFoundException e)
{
// FileNotFoundExceptions are handled here.
}
catch (IOException e)
{
// Extract some information from this exception, and then
// throw it to the parent method.
if(e.Source != null)
Console.WriteLine("IOException source: {0}", e.Source);
throw;
}
catch (InvalidCastException e)
{
// Perform some action here, and then throw a new exception.
throw new YourCustomException("Put your error message here.", e);
}
catch (InvalidCastException e)
{
if (e.Data == null)
{
throw;
}
else
{
// Take some action.
}
}
code example, the variable n is initialized inside the
try block(变量n实在try块内初始化的). An attempt to use this variable outside the
try block in the Write(n) statement will generate a compiler error(尝试在try块外使用Write(n)语句,使用n,那将长生一个错误).
static void Main()
{
int n;
try
{
// Do not initialize this variable here.
n = 123;
}
catch
{
}
// Error: Use of unassigned local variable 'n'.
Console.Write(n);
}
Example1
ProcessString method that may cause an exception. The
catch clause contains the exception handler that just displays a message on the screen. When the
throw statement is called from inside MyMethod, the system looks for the
catch statement and displays the message Exception caught.
class TryFinallyTest
{
static void ProcessString(string s)
{
if (s == null)
{
throw new ArgumentNullException();
}
}
static void Main()
{
string s = null; // For demonstration purposes.
try
{
ProcessString(s);
}
catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
}
}
}
/*
Output:
System.ArgumentNullException: Value cannot be null.
at TryFinallyTest.Main() Exception caught.
* */
Example2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestSEH
{
class Program
{
static string[] eTypes = {"none","simple","index","nested index"};
static void Main(string[] args)
{
foreach (string eType in eTypes)
{
try
{
Console.WriteLine("Main() try block reched.");
Console.WriteLine("ThrowException(\"{0}\") called.", eType);
ThrowException(eType);
Console.WriteLine("Main() try block continues.");
}
catch (System.IndexOutOfRangeException e)
{
Console.WriteLine("Main() System.IndexOutOfRangeException catch" + "black reched.Message:\n\"{0}", e.Message);
}
catch
{
Console.WriteLine("Main() general catch block reached.");
}
finally
{
Console.WriteLine("Main() finally block reched.");
}
Console.WriteLine();
}
Console.ReadKey();
}
static void ThrowException(string exceptionType)
{
Console.WriteLine("ThrowException(\"{0}\") reached.",exceptionType);
switch (exceptionType)
{
case "none" :
Console.WriteLine("Not throwing an exception.");
break;
case "simple" :
Console.WriteLine("Throwing System.Exception.");
throw (new System.Exception());
break;
case "index" :
Console.WriteLine("Throwing System.IndexOutOfRangeException.");
eTypes[4] = "error";
break;
case "nested index" :
try
{
Console.WriteLine("ThrowException(\"nested index\")" + "try black reached.");
Console.WriteLine("ThrowException(\"index\") called.");
ThrowException("index");
}
catch (Exception)
{
Console.WriteLine("ThrowException(\"nested index\") general" + "catch block reached.");
}
finally
{
Console.WriteLine("ThrowException(\"nested index\") finally"+"block reched");
}
break;
}
}
C#编程.异常处理(Exception Handling Statements)的更多相关文章
- Exception Handling Statements (C# Reference)
Exception Handling Statements (C# Reference) C# provides built-in support for handling anomalous sit ...
- Akka(26): Stream:异常处理-Exception handling
akka-stream是基于Actor模式的,所以也继承了Actor模式的“坚韧性(resilient)”特点,在任何异常情况下都有某种整体统一的异常处理策略和具体实施方式.在akka-stream的 ...
- Exception Handling Considered Harmful
异常处理被认为存在缺陷 Do, or do not. There is no try. - Yoda, The Empire Strikes Back (George Lucas) by Jason ...
- 异常处理与MiniDump详解(3) SEH(Structured Exception Handling)
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 一. 综述 SEH--Structured Exception Handlin ...
- Exception handling 异常处理的本质
异常处理的本质:状态回滚或者状态维护. https://en.wikipedia.org/wiki/Exception_handling In general, an exception breaks ...
- Exception Handling in ASP.NET Web API webapi异常处理
原文:http://www.asp.net/web-api/overview/error-handling/exception-handling This article describes erro ...
- C# to IL 10 Exception Handling(异常处理)
Exception handling in IL is a big let down. We expected a significant amount of complexity,but were ...
- Exception Handling引入MVP
异常处理(Exception Handling)是所有系统的最基本的基础操作之一,其它的比如日志(Logging).审核(Auditing).缓存(Caching).事务处理(Transaction) ...
- Unity、Exception Handling引入MVP
什么是MVP?在“MVP初探”里就有讲过了,就是一种UI的架构模式. 简单的描述一下Unity和Exception Handling Application Block: Unity是一个轻量级的可扩 ...
随机推荐
- 【spring boot】application.properties官方完整文档
官方地址: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/ 进入搜索: Appendice ...
- Java分割中英文,并且中文不能分割一半?
最近准备入其他坑位.在面试过程中,遇到下面这题笔试题,拿出来分享分享. 题目:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串.但是要保证汉字不被截半个,如“我ABC”4, ...
- java基础(1)-几种获取类的扩展方式
摘要 在日常开发过程中经常需要获取类的扩展集.即获取类的子类集(抽象类),或者接口实现类.比如说状态模式中,状态构建类,策略模式中的,策略构造方式.本文介绍几种获取方式. 实现 以策略模式为例 定义了 ...
- Django之用户认证auth模块使用
Auth认证模块 执行数据库迁移的那两条命令时,即使我们没有建表,django是不是也会创建好多张表?我们创建之后去看一下里面的一个叫auth_user表,既然是表,那肯定应该有对应的操作改表的方法 ...
- 最全java多线程总结2--如何进行线程同步
上篇对线程的一些基础知识做了总结,本篇来对多线程编程中最重要,也是最麻烦的一个部分--同步,来做个总结. 创建线程并不难,难的是如何让多个线程能够良好的协作运行,大部分需要多线程处理的事情都不 ...
- spring boot 2.x 系列——spring-boot 集成 Swagger2 打造在线接口文档
文章目录 一.Springfox 与 Swagger 简介 1.1 Springfox 1.2 Swagger 1.3 OpenApi.Swagger.Springfox的关系 二.spring bo ...
- laravel扩展包-私有库
创建一个新的laravel项目 composer create-project --prefer-dist laravel/laravel laravel-package "5.5.*&qu ...
- 数据库之MySQL的基本使用
数据库简介 数据库 数据库就是一种特殊的文件,其中存储着需要的数据:关系型数据库核心元素: 数据行(记录) 数据列(字段) 数据表(数据行的集合) 数据库(数据表的集合) Ubuntu进入数据库: 1 ...
- python爬取拉勾网数据并进行数据可视化
爬取拉勾网关于python职位相关的数据信息,并将爬取的数据已csv各式存入文件,然后对csv文件相关字段的数据进行清洗,并对数据可视化展示,包括柱状图展示.直方图展示.词云展示等并根据可视化的数据做 ...
- 02-三种Bean装配机制(三)
在前两篇中分别介绍了自动化装配机制和通过JavaConfig类进行装配,接下来介绍下通过XML装配bean,其实就目前趋势来看,这种方式用的越来越少(不是我说的,是作者说的,喜欢这种方式的别喷我