异常
语法上没有错误,在程序运行的过程当中,由于某些原因程序出现了错误,不能再正常的运行。
异常捕获
在写程序的过程中会经常出现各种各样的异常,如果想要程序继续运行,在代码中应该经常性的使用 try-catch 来进行异常捕获。
语法:
try
{
可能会出现异常的代码;
}
carch
{
出现异常后要执行的代码;
}
执行过程:如果 try 中的代码没有出现异常,那么 catch 中的代码不会执行。如果 try 中的代码出现了异常,那么这行出现异常的代码后面还有代码都不会执行了,而是直接跳到 catch 中执行代码。
下面图中的代码 int number = Convert.ToInt32(Console.ReadLine());有一个异常。
捕获异常:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 高山异常捕获
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入一个数字");
int number = 0;
try
{
// 捕获异常
number = Convert.ToInt32(Console.ReadLine());
}
catch
{
// 出现异常后执行的代码
Console.WriteLine("输入的内容不能够转换成数字");
}
Console.WriteLine(++number);
Console.ReadKey();
}
}
}
输出结果:
那么问题来了:
为什么把字段 number 另外声明还要赋值初值呢 ? 为什么输出后面还有一个0呢 ? 当我们捕获异常时由于后面我们要操作字段(作用域问题)并且未赋初值的字段不能使用,所以要先声明一下字段并赋初值,输出 catch 语句后还输出了一个 0 ,是因为 catch 里面的语句结束后会继续执行下面的语句。
在实际开发中往往我们想要的结果并不是这样的,而是当执行成功时我们要执行一些逻辑或其它代码,当执行失败时就要告知我们的用户一些信息。
那么该怎么解决呢?两种方法。
1. 直接将执行成功时要执行的代码直接写在 try 中。(不建议)
2. 定义一个 bool 值,当执行成功时 true ,当执行失败时 false,在下面判断为 true 时执行要执行的代码。(建议使用)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 高山异常捕获
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("请输入一个数字");
int number = 0;
bool b = true;
try
{
// 捕获异常
number = Convert.ToInt32(Console.ReadLine());
}
catch
{
// 出现异常后执行的代码
Console.WriteLine("输入的内容不能够转换成数字");
b = false;
}
if (b)
{
Console.WriteLine(number * 1);
}
Console.ReadKey();
}
}
}
知识点:
- 变量的作用域:
变量的作用域就是能够使用到这个变量的范围。
变量的作用域一般从声明它的那个括号开始到那个括号所对应的结束的括号结束。在这个范围内,我们可以访问并使用变量。超出这个范围则访问不到。