异常处理
1)系统报错信息
try
{
1行: Console.WriteLine("错误前");
2行: int i = Convert.ToInt32("ad");
3行: Console.WriteLine("错误后2");
4行: Console.WriteLine(i);
}
catch(Exception ex)
{
5行: Console.WriteLine("数据错误:"+ex.Message+"堆栈数据"+ex.StackTrace);
}
6行: Console.WriteLine("处理错误3");/就算数据出错,也能执行这一行,说明try,catch是将错误给抓出来,不影响后面的运行;但是在try里面的如果他前面有错误后面的将不会被执行;
说明:先执行第1行,执行第2行出错了,直接跳到第5行;第5行显示第2行出错的信息。在try里面的3、4行将不会被执行。第六行没有在try里面可以被执行;如果没有try……catch,当程序执行到第二行时出错,整个程序就崩了,直接不会运行。
注:try……catch,try里面的出错了,程序还会被执行,因为错误行不会被运行,转而代替错误行的是执行catch里面。但是try里面在错误行之后的也不会被执行了。try之外的可以被执行。
2)自定义报错信息
throw new Exception(”子自定义错误”);
static void Main(string[] args)
{
try
{
Age(200);
}
catch (Exception ex1)
{
Console.WriteLine("输入的年龄错误"+ex1.Message);
}
}
static string Age(int age)
{
if (age < 0)
{
throw new Exception("你输入的年龄非法");//当调用message将会输出这里,这里是我们自己定义的数据错误处理结果;在系统自动报错里面输出的message是系统为我们找出错误的。而这里是我们自己定义的,也可以说是预先设定的可能出现的错误处理;
}
else if (age > 150)
{
throw new Exception("你是火星人吗?");
}
else
{
return "你是正常人";
}
}
3.其他信息的异常处理
OverflowException 获取异常的是否溢出;
DivideByZeroException 获取异常是否整除了零;
Exception 获取异常的输入是否合法;
if (tb_number1.Text != "" && tb_number2.Text != "")
{ //在处理前先判断用户是否输入了值。
//节约系统开支(想下什么这里说这样做是为了节约系统开支)
try
{
//从tb_number1和tb_number2中获取要计算的字符
string txt1 = tb_number1.Text;
string txt2 = tb_number2.Text;
//将字符串转换为int类型
int num1 = int.Parse(txt1);
int num2 = int.Parse(txt2);
//计算,在计算的时候我们使用switch来判断用户是选择的哪一个运算符
int result; //该变量用来记录运算结果
switch (cb_flag.Text)
{
case "+":
result = num1 + num2;
break;
case "-":
result = num1 - num2;
break;
case "*":
result = num1 * num2;
break;
case "/":
result = num1 / num2;
break;
default:
result = 0;
break;
}
lbl_result.Text = result.ToString();
}
//当参数格式不符合调用的方法的参数规范时引发的异常。
catch (FormatException fex)
{
//MessageBox.Show(fex.Message); //直接弹出异常所携带的消息
//弹出的警告框会让人厌恶所以我们可以使用下面的代码来改善用户体验
lbl_result.Text = fex.Message; //让显示结果的label来显示提示。
lbl_result.ForeColor = Color.Red;//为了更显眼,让字体变为红色
return;
}
catch (OverflowException ofex)
{ //溢出错误
MessageBox.Show(ofex.Message); //直接弹出当前捕获的异常所携带的消息
return;
}
catch (DivideByZeroException dze)
{ //除零
MessageBox.Show(dze.Message); //直接弹出当前捕获的异常所携带的消息
return;
}
catch (Exception ex)
{ //无效输入
MessageBox.Show(ex.Message); //直接弹出当前捕获的异常所携带的消息
return;
}
}
else
{ //如果没有输入完整的值,这里给出提示
MessageBox.Show("请先输入有效的值");
return;
}
注:如果数据整除了零,那么就会触发异常处理的DivideByZeroException 对象,那么catch自然会将它抓出来的。