C# ErrorsAndExceptions- 错误与异常的学习-《C#高级编程》学习笔记
2017-03-21 13:57
337 查看
/* 错误与异常
* 原因:出于某些意外情况,只返回错误代码无法满足代码的需求,对于出现错误的地方,可能由于嵌套比较多,需要跳出嵌套。于是我们就需要异常类中的
* try 。。。catch。。。finally 方法
*
* 异常种类:除了IOException和CompositionException类,一般异常类都在System名称空间下,即systemExcetpion类。这三个类都派生于最初的父类Exception类
* Exception类中比较重要的两个异常类:applicationException类和systemException类
* applicationException类:原本用于自定义程序异常类的基类。后多用Exception基类派生自定义类
* systemException类:用于.net运行库抛出的异常,几乎可以由所有应用程序抛出的异常,有非常一般的本质,包含大部分的异常情况。
* 大部分的异常类大多数都是用于更加准确的定义错误的原因,相比较他们的基类,没有额外的功能。(实际自定义时,可能要经常添加额外的属性)
*
* try 。。。catch。。。finally 方法
*
* try
* {
* 用于执行代码中正常的操作,但是这部分操作可能会产生某些错误或者异常
* }
* catch
* {
* 这里的代码用于处理try代码块中可能产生的错误和异常,也能在这里记录错误
* }
* finally
* {
* 这里的代码是用于收尾,清理资源或者是在try和catch结尾要做的操作。
* 1.finally这段是可选的,如果没有需要在try和catch之后执行的操作,这块代码可以省略,不写finally块
* 2.如果有finally块,那么finally块一定会被执行,无论是否有异常抛出即无论是否执行catch块。
*
*
* 流程
* 1 执行try块中的代码
* 2 代码有错误 跳转到3,代码没错误,跳转到4
* 3 执行catch中的代码,结束后跳转到4
* 4 如果有finally块,则执行finally块中的代码,然后流程结束。如果没有就直接结束try-catch流程。
*
* 备注,可以有多个catch块,处理不同的错误,但是不应该包含太多,影响性能。
*
*/
//代码
bool Overflow = false;
bool OutOfBounds = true;
try
{
if (Overflow == true)
throw new OverflowException();
if (OutOfBounds == true)
throw new IndexOutOfRangeException();
}
catch (OverflowException ex)
{
Console.WriteLine("You catch a exception and the message is "+ex.Message);
}
catch(IndexOutOfRangeException ex)
{
Console.WriteLine("You catch a exception and the message is " + ex.Message);
}
finally
{
Overflow = false;
OutOfBounds = false;
}
/*设置Overflow和OutOfBounds 都为true时,运行代码,命令行中只输出You catch a exception and the message is Arithmetic operation resulted in an overflow.
* 说明 1 try-catch已经成功捕获到了OverflowException ,并且打印了信息。
* 2 当系统发现一个throw异常情况之后,他会立刻推出栈上所有方法的调用,即在例子中停止try中后续的代码执行,然后去查找合适的catch块的开头,所以我们只能打印出
* 第一个异常的信息。
*当我们把overflow设置成false时,输出You catch a exception and the message is Index was outside the bounds of the array. 说明第二个异常已经被捕获。
*/
/*
* 让用户多次输入一个数字,数字必须在0-5之间,如果不在这个区间内,则不能正确的处理这个数字。程序抛出异常,要求用户再输入新的数字,直到用户不再输入数字为止
* Console.ReadLine() 获取用户输入的字符串,经过convert.toint32方法,转换成int类型
* break语句用来退出while循环和try语句,注意,如果有finally块时,退出try语句一定会执行finally模块。一旦结束finally块以后,就会执行下一条语句,如果没有
* finally块时,该语句也会执行
* catch exception 这段代码中还调用了三个系统方法 readline,writeline和covert.toint方法,所以用exception去接收异常。例如输入文字的时候
* catch块的顺序很重要,由于处理完catch中的事情之后,就会进入finally块,所以在多个catch块中,越是需要特殊处理的异常错误,越是要早编写,
* 把一般的块,处理大部分普通情况的块放到后面去。
*/
while (true)
{
try
{
string inputStr;
Console.Write("Please intput a number between 0~5 " + "(or hit return to exit)>");
inputStr = Console.ReadLine();
//如果为空就直接退出
if (inputStr == "")
break;
int index = Convert.ToInt32(inputStr);
//判断数字
if (index > 5 || index < 0)
throw new IndexOutOfRangeException();
Console.WriteLine("Your number is " + index);
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine("The number should between 0~5.{0}", ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("An exception was thrown.The message is {0}",ex.Message);
}
finally
{
Console.WriteLine("Thx");
}
}
/*
*exception 有很多属性
* data 这个属性可以给异常添加键/值语句,提供额外的关于异常的信息
* helplink 链接到要一个帮助文档上,提供更多信息
* innerexception 如果是在catch中抛出的,就会把代码发送到catcah块中的异常对象
* message 描述文本
* source 导致异常的应用程序名或者对象名
* stacktrace 栈上方法调用的详细信息,有助于跟踪抛出异常的方法
* targetsite 描述抛出异常方法的.net反射对象
*
* 例子
*/
try
{
Exception ex = new Exception("innerException");
var myexception = new myExceptionClass("help",ex);
myexception.Source = "study_day1";
myexception.HelpLink = "fake.txt";
myexception.Data.Add("message1", "help");
myexception.Data["time"] = DateTime.Now;
throw myexception;
}
catch (myExceptionClass ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.Data["time"]);
if(ex.InnerException != null)
Console.WriteLine(ex.InnerException.Message);
}
finally
{
Console.WriteLine();
}
/*
* 如果有多个try catch嵌套
* 如果从try中抛出的异常,就去找对应catch中的处理,如果没有,到上一级的catch中去寻找相应的异常,直到找到为止
9e43
* 如果是从catch中抛出的异常,就直接到上一级的catch中去寻找相应的异常,直到找到为止。
* 每个阶段中,当退出catch块后就会执行对应的finally块。
*/
/*
*内部嵌套异常,innerexception
* 可以在处理异常的catch中去判断是否有内部异常,可以知道内部异常的具体信息,从而更加精确定位异常出现的问题。
*/
myExceptionClass 类代码
namespace study_day1
{
class myExceptionClass:Exception
{
public myExceptionClass(string message) : base(message)
{
}
public myExceptionClass(string message, Exception ex) : base(message, ex)
{
}
}
}
//调用者信息
class Program
{
static void Main(string[] args)
{
/*
* 调用者信息
* callerLine,CallerFilePath,CallerMemberName
* 分别用于显示调用的行数,调用的路径,调用的方法名称
* 使用时需要先导入system.runtime.compilerserices
*/
var p = new Program();
p.getLog();
}
}
public void getLog([CallerMemberName] string memberName = "", [CallerLineNumber] int line = 0, [CallerFilePath] string path = ""
)
{
Console.WriteLine((line < 0) ? "no line" : "line " + line);
Console.WriteLine((memberName == null) ? "no member" : memberName);
Console.WriteLine((path == null) ? "no path" : path);
}
* 原因:出于某些意外情况,只返回错误代码无法满足代码的需求,对于出现错误的地方,可能由于嵌套比较多,需要跳出嵌套。于是我们就需要异常类中的
* try 。。。catch。。。finally 方法
*
* 异常种类:除了IOException和CompositionException类,一般异常类都在System名称空间下,即systemExcetpion类。这三个类都派生于最初的父类Exception类
* Exception类中比较重要的两个异常类:applicationException类和systemException类
* applicationException类:原本用于自定义程序异常类的基类。后多用Exception基类派生自定义类
* systemException类:用于.net运行库抛出的异常,几乎可以由所有应用程序抛出的异常,有非常一般的本质,包含大部分的异常情况。
* 大部分的异常类大多数都是用于更加准确的定义错误的原因,相比较他们的基类,没有额外的功能。(实际自定义时,可能要经常添加额外的属性)
*
* try 。。。catch。。。finally 方法
*
* try
* {
* 用于执行代码中正常的操作,但是这部分操作可能会产生某些错误或者异常
* }
* catch
* {
* 这里的代码用于处理try代码块中可能产生的错误和异常,也能在这里记录错误
* }
* finally
* {
* 这里的代码是用于收尾,清理资源或者是在try和catch结尾要做的操作。
* 1.finally这段是可选的,如果没有需要在try和catch之后执行的操作,这块代码可以省略,不写finally块
* 2.如果有finally块,那么finally块一定会被执行,无论是否有异常抛出即无论是否执行catch块。
*
*
* 流程
* 1 执行try块中的代码
* 2 代码有错误 跳转到3,代码没错误,跳转到4
* 3 执行catch中的代码,结束后跳转到4
* 4 如果有finally块,则执行finally块中的代码,然后流程结束。如果没有就直接结束try-catch流程。
*
* 备注,可以有多个catch块,处理不同的错误,但是不应该包含太多,影响性能。
*
*/
//代码
bool Overflow = false;
bool OutOfBounds = true;
try
{
if (Overflow == true)
throw new OverflowException();
if (OutOfBounds == true)
throw new IndexOutOfRangeException();
}
catch (OverflowException ex)
{
Console.WriteLine("You catch a exception and the message is "+ex.Message);
}
catch(IndexOutOfRangeException ex)
{
Console.WriteLine("You catch a exception and the message is " + ex.Message);
}
finally
{
Overflow = false;
OutOfBounds = false;
}
/*设置Overflow和OutOfBounds 都为true时,运行代码,命令行中只输出You catch a exception and the message is Arithmetic operation resulted in an overflow.
* 说明 1 try-catch已经成功捕获到了OverflowException ,并且打印了信息。
* 2 当系统发现一个throw异常情况之后,他会立刻推出栈上所有方法的调用,即在例子中停止try中后续的代码执行,然后去查找合适的catch块的开头,所以我们只能打印出
* 第一个异常的信息。
*当我们把overflow设置成false时,输出You catch a exception and the message is Index was outside the bounds of the array. 说明第二个异常已经被捕获。
*/
/*
* 让用户多次输入一个数字,数字必须在0-5之间,如果不在这个区间内,则不能正确的处理这个数字。程序抛出异常,要求用户再输入新的数字,直到用户不再输入数字为止
* Console.ReadLine() 获取用户输入的字符串,经过convert.toint32方法,转换成int类型
* break语句用来退出while循环和try语句,注意,如果有finally块时,退出try语句一定会执行finally模块。一旦结束finally块以后,就会执行下一条语句,如果没有
* finally块时,该语句也会执行
* catch exception 这段代码中还调用了三个系统方法 readline,writeline和covert.toint方法,所以用exception去接收异常。例如输入文字的时候
* catch块的顺序很重要,由于处理完catch中的事情之后,就会进入finally块,所以在多个catch块中,越是需要特殊处理的异常错误,越是要早编写,
* 把一般的块,处理大部分普通情况的块放到后面去。
*/
while (true)
{
try
{
string inputStr;
Console.Write("Please intput a number between 0~5 " + "(or hit return to exit)>");
inputStr = Console.ReadLine();
//如果为空就直接退出
if (inputStr == "")
break;
int index = Convert.ToInt32(inputStr);
//判断数字
if (index > 5 || index < 0)
throw new IndexOutOfRangeException();
Console.WriteLine("Your number is " + index);
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine("The number should between 0~5.{0}", ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("An exception was thrown.The message is {0}",ex.Message);
}
finally
{
Console.WriteLine("Thx");
}
}
/*
*exception 有很多属性
* data 这个属性可以给异常添加键/值语句,提供额外的关于异常的信息
* helplink 链接到要一个帮助文档上,提供更多信息
* innerexception 如果是在catch中抛出的,就会把代码发送到catcah块中的异常对象
* message 描述文本
* source 导致异常的应用程序名或者对象名
* stacktrace 栈上方法调用的详细信息,有助于跟踪抛出异常的方法
* targetsite 描述抛出异常方法的.net反射对象
*
* 例子
*/
try
{
Exception ex = new Exception("innerException");
var myexception = new myExceptionClass("help",ex);
myexception.Source = "study_day1";
myexception.HelpLink = "fake.txt";
myexception.Data.Add("message1", "help");
myexception.Data["time"] = DateTime.Now;
throw myexception;
}
catch (myExceptionClass ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.Data["time"]);
if(ex.InnerException != null)
Console.WriteLine(ex.InnerException.Message);
}
finally
{
Console.WriteLine();
}
/*
* 如果有多个try catch嵌套
* 如果从try中抛出的异常,就去找对应catch中的处理,如果没有,到上一级的catch中去寻找相应的异常,直到找到为止
9e43
* 如果是从catch中抛出的异常,就直接到上一级的catch中去寻找相应的异常,直到找到为止。
* 每个阶段中,当退出catch块后就会执行对应的finally块。
*/
/*
*内部嵌套异常,innerexception
* 可以在处理异常的catch中去判断是否有内部异常,可以知道内部异常的具体信息,从而更加精确定位异常出现的问题。
*/
myExceptionClass 类代码
namespace study_day1
{
class myExceptionClass:Exception
{
public myExceptionClass(string message) : base(message)
{
}
public myExceptionClass(string message, Exception ex) : base(message, ex)
{
}
}
}
//调用者信息
class Program
{
static void Main(string[] args)
{
/*
* 调用者信息
* callerLine,CallerFilePath,CallerMemberName
* 分别用于显示调用的行数,调用的路径,调用的方法名称
* 使用时需要先导入system.runtime.compilerserices
*/
var p = new Program();
p.getLog();
}
}
public void getLog([CallerMemberName] string memberName = "", [CallerLineNumber] int line = 0, [CallerFilePath] string path = ""
)
{
Console.WriteLine((line < 0) ? "no line" : "line " + line);
Console.WriteLine((memberName == null) ? "no member" : memberName);
Console.WriteLine((path == null) ? "no path" : path);
}
相关文章推荐
- C# ErrorsAndExceptions- 错误与异常的学习-《C#高级编程》学习笔记
- The Python Tutorial 3.2 - 8Errors and Exceptions(错误和异常)
- 错误和异常(Errors and Exceptions)
- flask + MongoDB 学习笔记: Exceptions, Errors and Solutions
- python tutorial 学习笔记(七)Errors and Exceptions
- C# 2010 从入门到精通 学习笔记5 第6章 管理错误和异常
- Python Tutorial 学习笔记6 --Errors and Exceptions
- C# 2010 从入门到精通 学习笔记5 第6章 管理错误和异常
- 从C#到Objective-C,循序渐进学习苹果开发(4)--代码块(block)和错误异常处理的理解
- C#学习使用try-catch-finally错误处理表达式(续)--定义自己的异常消息类
- 【幻化万千戏红尘】qianfengDay12-java基础学习:二维数组、异常、错误
- 随手记:机器学习工程师新手最常犯的六种错误(Top 6 errors novice machine learning engineers make)
- 异常与错误区别 Error and Exception
- Effective Java学习笔记: 第58条 对可恢复的情况使用受检异常,对于编程错误使用运行时异常
- Spring学习心得(20)--aop的需求分析:错误异常分析
- 《C#高级编程》【第二章】核心C#编程 -- 学习笔记
- Python学习笔记五:错误与异常
- C#错误和异常的处理
- C#基础学习之异常捕获用法小例
- 第九 讲 : C# 的异常处理- 【天轰穿.Net4趣味编程系列视频教程-vs2010轻松学习C#】