C#_try语句

本文详细解析了C#中try-catch-finally语句的使用,包括异常处理的基本概念,如何通过try语句捕捉并处理运行时错误,以及如何利用finally子句确保代码的稳定执行。文章还提供了具体的代码示例,展示了如何处理多种类型的异常,并介绍了throw语句的使用。

try语句定义

try 语句提供一种机制,用于捕捉在块的执行期间发生的各种异常。此外,try 语句还能让您指定一个代码块,并保证当控制离开 try 语句时,总是先执行该代码。

try-statement:
	try   block   catch-clauses
	try   block   finally-clause
	try   block   catch-clauses   finally-clause//你可以有多个cach子句,但只能有一个finally子句
catch-clauses:
	specific-catch-clauses   general-catch-clauseopt
	specific-catch-clausesopt   general-catch-clause
specific-catch-clauses:
	specific-catch-clause
	specific-catch-clauses   specific-catch-clause
specific-catch-clause:
	catch   (   class-type   identifieropt   )   block
general-catch-clause:
	catch   block
finally-clause:
	finally   block

有三种可能的 try 语句形式:

  • 一个 try 块后接一个或多个 catch 块。
  • 一个 try 块后接一个 finally 块。
  • 一个 try 块后接一个或多个 catch 块,后面再跟一个 finally 块。

try示例

需求:两个字符串数值相加的和

	class Program
    {
        static void Main(string[] args)
        {
            Parses p = new Parses();
            int a = p.Add("100", "200");
            Console.WriteLine(a);
        }
        
    }
    class Parses
    {
        public int Add(string arg1,string arg2)
        {
            int a = int.Parse(arg1);
            int b = int.Parse(arg2);
            int result = checked(a + b);
            return result;
        }
    }

上面的代码正常来说是没有问题的但是,当用户输入的值有问题的时候,比如说

 static void Main(string[] args)
        {
            Parses p = new Parses();
            int a = p.Add("100", "200");
            //比如说输入的数值为a或则没有输入,为null的时候程序就会报错,从而崩溃
            Console.WriteLine(a);
        }

在这里插入图片描述

try捕捉异常

这个时候就需要使用try语句来捕捉并处理这些异常
首先我们得知道,这些逻辑哪里可能会出现异常

 class Program
    {
        static void Main(string[] args)
        {
            Parses p = new Parses();
            int a = p.Add(null, "200");
            Console.WriteLine(a);
        }
        
    }
    class Parses
    {
        public int Add(string arg1,string arg2)
        {
            int a = int.Parse(arg1);//这里,当arg1为null或不是数字或值溢出的时候会报错
            int b = int.Parse(arg2);//这里也一样
            int result = checked(a + b);//这里会吗?,也会
            //arg1+arg2加起来的值可能会报错,所以这里也需要捕捉一下异常
            return result;
        }
    }

简单实用try修改后的方法

	public int Add(string arg1,string arg2)
	{
	    int a;
	    int b;
	    try
	    {
	        a = int.Parse(arg1);
	        b = int.Parse(arg2);
	    }
	    catch
	    {
	        a = 0;
	        b = 0;
	        Console.WriteLine("你输入的值有问题");
	    }
	    int result = a + b;
	    return result;
	}

精细化的try语句修改后的代码:

阅读csdn文档,我们可以知道Parse方法有三个异常

  1. ArgumentNull 值为空
  2. Format 非数字
  3. Overflow 值溢出

根据这个我们可以使用try精细化捕捉程序可能出现的异常

	public int Add(string arg1,string arg2)
	{
	    int a=0;
	    int b=0;
	    try
	    {
	        a = int.Parse(arg1);
	        b = int.Parse(arg2);
	    }
	    catch(ArgumentException)
	    {
	        Console.WriteLine("你输入的值为空");
	    }
	    catch (FormatException)
	    {
	        Console.WriteLine("你输入的值不为数字");
	    }
	    catch(OverflowException)
	    {
	        Console.WriteLine("");
	    }
	    int result = a + b;
	    return result;
	}

使用标识符将异常输出

我们也可以添加标识符来将异常输出

	public int Add(string arg1,string arg2)
	{
	    int a=0;
	    int b=0;
	    try
	    {
	        a = int.Parse(arg1);
	        b = int.Parse(arg2);
	    }
	    catch(ArgumentNullException ane)
	    //标识符是可省的
	    //catch 抓住异常之后,产生的实例使用ane来接收
	    {
	        Console.WriteLine(ane);//输出刚刚的异常
	    }
	    catch (FormatException fe)
	    {
	        Console.WriteLine(fe);
	    }
	    catch(OverflowException oe)
	    {
	        Console.WriteLine(oe);
	    }
	    finally//不管程序有没有异常,都会执行
	    {
	    //finally一般用于关闭各种链接的.
	    //比如当系统链接了数据库hi,执行关闭连接的代码块出现了异常
	    //这个finally就可以将系统链接关闭,用于执行异常
	    }
	    int result = a + b;
	    return result;
	}

throw

就是抛出一个异常,并获取这个异常的引用,这个异常会被抛到外部的环境,由外部环境进行处理这里抛出了一个Exception,Exception是throwable的子类,是所有异常的基类。与此同时,throwable还有另一个子类,也就是Error。这里会把Exception这个引用抛到外部环境中去处理。

  • 这里我们使用上面的代码来继续讲throw
	public int Add(string arg1,string arg2)
	{
	    int a=0;
	    int b=0;
	    try
	    {
	        a = int.Parse(arg1);
	        b = int.Parse(arg2);
	    }
	    catch(ArgumentNullException ane)
	    //标识符是可省的
	    //catch 抓住异常之后,产生的实例使用ane来接收
	    {
	        Console.WriteLine(ane);//输出刚刚的异常
	    }
	    catch (FormatException fe)
	    {
	        Console.WriteLine(fe);
	    }
	    catch(OverflowException oe)
	    {
	       // Console.WriteLine(oe); //在这里我处理这个异常,
	       throw oe ;//我们直接将这个可能出现的异常oe抛出给调用者,让他处理这个可能出现的异常
	       
	    }
	    finally//不管程序有没有异常,都会执行
	    {
	    //finally一般用于关闭各种链接的.
	    //比如当系统链接了数据库hi,执行关闭连接的代码块出现了异常
	    //这个finally就可以将系统链接关闭,用于执行异常
	    }
	    int result = a + b;
	    return result;
	}
  • 那抛出的异常怎么处理呢?
  • 谁调用谁处理,示例如下
	static void Main(string[] args)
	{
	    Parses p = new Parses(); //这里调用了刚刚的那个放发就有可能出现overflow的异常
	    int a = 0;
	    try
	    {
	       a= p.Add(null, "200");
	    }
	    catch (Exception oe)
	    {
	
	        Console.WriteLine(oe);
	    }
	    Console.WriteLine(a);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qayrup

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值