异常处理
//语法上没有错误,在程序运行的过程中,由于某些原因程序出现错误,不能正常运行
// 在你的代码中应该经常使用try-catch来进行异常捕获
// 哪行代码有可能出现异常,你就try一下
/*
* try catch之间不允许有其他代码
* try
* {
* 可能会出现异常的代码
* }
* catch
* {
* 出现异常后要执行的代码
*
* }
* finally
* {
*
* }
*
* 执行过程:如果try中的代码没有出现异常,那么catch中代码不会执行。
* 如果try中的代码出现异常,哪怕这行出现异常的代码后面有一百行都不会执行了
* 而是直接跳到catch中执行代码
*
*/
class Program
{
static void Main(string[] args)
{
bool b = true;
int number = 0;
Console.WriteLine("请输入一个数字:");
//当try块中某行代码发生异常后,从该行代码开始后面的代码都不会继续执行了
//程序直接调转到catch块中进行
try
{
Console.WriteLine("----------------------------");
number = int.Parse(Console.ReadLine());
Console.WriteLine("=================================");
}
catch(Exception ex)
{
//console.writeline("您输入的类型有误!");
Console.WriteLine(ex.Message);
b = false;
}
finally
{
//finally块中代码,无论是否引发异常,都会执行,不允许出现return
Console.WriteLine("######################################");
}
if (b)
{
Console.WriteLine(number*2);
}
Console.ReadKey();
}
}
catch的几种写法
class Program
{
static void Main(string[] args)
{
try
{
int n = 10, m = 0;
int r = n / m;
Console.WriteLine(r);
}
//第三种,对不同的异常,使用不同的方式来处理(使用多个不同的catch块来捕获异常)
catch (NullReferenceException e)
{
//空指针异常
Console.WriteLine("空指针异常:{0}", e.Message);
}//[dɪˈvaɪd]
catch (DivideByZeroException e)
{
//除数为0的异常
Console.WriteLine("除数为0异常,详细信息:{0}", e.StackTrace);
}
catch (ArgumentException e)
{
//参数异常
Console.WriteLine("参数异常,详细信息为:{0", e.StackTrace);
}
//这个一定要放在最后面
catch(Exception e)
{
//捕获所有异常
Console.WriteLine(e.StackTrace);
}
//第一种:这种写法可以捕获try块中的所有异常
//catch
//{
// Console.WriteLine("发生异常了");
//}
//第二种:这种写法可以捕获try块中的所有异常,但这个有参数,异常信息可以更详细
//catch (Exception ex)
//{
// Console.WriteLine(ex.Message);//发生异常的消息
// Console.WriteLine(ex.Source);//导致发生异常的应用程序或者对象名称
// Console.WriteLine(ex.StackTrace);//发生异常的跟踪信息,哪个文件,第几行,哪个代码
//}
Console.ReadKey();
}
}
自行引发异常throw
class Program
{
static void Main(string[] args)
{
while (true)
{
try
{
Console.WriteLine("请输入一个人名:");
string name = Console.ReadLine();
if (name == "黄鹏")
{
//建议,这个方式我们应该尽量用if判断规避异常,除非必须得用了,再用,异常本身比较损耗资源
//手动抛出异常
//throw new Exception("不能输入这个名字");
throw new MyException("不能输入这个名字");
}
else
{
Console.WriteLine("名字合法,{0}",name);
}
}
catch (MyException ex)
{
Console.WriteLine("发生异常了");
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
}
}
}
//自定义异常类
public class MyException : Exception
{
public MyException(string message) : base(message)
{
}
}
思考题
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("111111111111111111111111");
//int n = 10, m = 0;
//int r = n / m;
Console.WriteLine("2222222222222222222222222");
return;
}
catch (Exception)
{
Console.WriteLine("3333333333333333333333333333");
}
finally
{
Console.WriteLine("44444444444444444444444444444");
Console.ReadKey();
}
Console.WriteLine("55555555555555555555555555555555555");
Console.ReadKey();
}
}
应用程序示例
class Program
{
//检查邮箱是否合法
public static bool CheckEmail(string email)
{
string[] arrString = email.Split("@");
//如果输入的Email不能被@分成两部分则抛出异常
if (arrString.Length != 2)
{
throw new EmailErrorException("电子邮箱@符错误");
}
else
{
//找邮箱中.的位置
int index = arrString[1].IndexOf(".");
//如果找不到. 或者最后一位是.的话
if (index == -1 || index == arrString[1].Length - 1)
{
throw new EmailErrorException("电子邮箱点号错误");
}
}
//如果没问题,返回true
return true;
}
static void Main(string[] args)
{
Console.WriteLine("请输入你的邮箱:");
string email = Console.ReadLine();
if (email.Length==0)
{
Console.WriteLine("信息不完整!");
return;
}
try
{
CheckEmail(email);
}
catch (EmailErrorException e)
{
Console.WriteLine("格式错误:{0}", e.Message);
}
Console.WriteLine("你填的邮箱地址是:{0}", email);
Console.ReadKey();
}
}
//自定义异常类
public class EmailErrorException:Exception
{
public EmailErrorException(string message) : base(message)
{
}
}
调试
/*
* 程序调试:
* 1.写完一段程序后,想看一下这段程序的执行过程。
* 2.当你写完这段程序后发现程序并没有按照你想想的样子去执行
*
* 调试方法:
* 1.F11逐语句调试(单步调试)
* 2.F10逐过程调试
* 3.断点调试
*
* 局部变量:显示当前正在运行的方法中的局部变量的值
* 步骤,开启断点->运行->调试->窗口->局部变量
* 监视:开启断点->运行->调试->窗口->监视
* 即时:运行->全部中断->窗口->即时 :要查找的值,必须在前面加个"?" 按回车键 出结果
* 快速监视:调试->快速监视 :写上要监视的变量,添加即可
*
*/
网友评论