【C#】异常处理

  • 定义
  • 语句
    • TRY
    • CATCH
    • FINALLY
    • 错误和异常处理-SystemException属性和方法
  • 抛出异常作用
    • 错误处理DEMO
  • 一些常用的异常类
  • 总结

  • 最近学完C#之后,感触最深的就是C#中的异常处理,相比于之前学过的VB,C#中的异常处理更能让我提起对这方面的重视。为了防止让用户进行无效等待,也为了能让用户明白我们的软件在运行过程中哪里出现了异常,出现了什么样的错误,原因是什么,是否存在解决方法等等,这一切都需要后台一系列的异常处理机制。

  • 那么我们就来认识和总结一下这套机制

定义

首先需要明确的是:[错误][6]并不等同于[异常][6],因为到目前为止,没有任何一款软件是完美的,程序可以没有错误,但是一定会有异常。

  • 对于整个软件系统:当程序在调试或者运行时出现异常,如果该程序有异常处理机制,则会抛出这套机制相应的措施来拱程序员或者用户进行处理,如果没有这套措施,系统则会将该异常挂起,反映到用户界面则是非常不友好的异常提示。

  • 对于代码:异常处理措施则是在建立处理模块的过程中需要的“外包层”,提供该段代码的异常处理机制。

语句

TRY

  • 什么是”Try”
    这就是刚才提到的代码书写中的“外包层”,在一个良好的、用户友好的程序都需要提供这个“外包层”,将程序中所有可能涉及的异常都要考虑到,并提供相应的解决方案以及措施。

  • 使用方法:

try
{
    //可能包含异常的过程;
}

CATCH

  • 什么是“Catch”?
    catch块包含了包含了代码处理各种错误问题的情况。

-使用方法:

catch
{
    //错误处理;
}

FINALLY

  • 什么是”Finaly”?
    包含了代码清理资源或执行要在try块末尾执行的其他操作。

  • 使用方法:

finally
{
    //资源清理
}

错误和异常处理-System.Exception属性和方法

  • HelpLink:如果合适,链接到一个帮助文件上,以提取异常的更多信息
  • Message:提供文本,通常是给异常的构造函数提供,该文本描述了错误情况。
  • Source:导致异常的程序或对象名。
  • TargetSite:抛出异常的方法名。
  • StackTrace:堆栈上方法调用的信息,有助于跟踪抛出异常的方法。

[需要注意的是:][6]在这些属性中,StackTrace和TargetSite是由.NET运行时自动提供的,根据编译器选项TargetSite可能会不能使用。此时返回的是空值。而其他的属性则必须由抛出异常的代码提供,他们的方法是在抛出异常前及时设置的这些属性。例如:

if(ErrorConditon==true)
{
    Exception MyException=new classMyException("Help!");
    MyException.Source="MyProgram";
    MyException.Helplink="MyHelpFiles.txt";
    throw MyException;
}

“抛出异常”作用

  • 抛出异常是为了告诉程序的使用者,程序产生的错误是由他们调用引起的。

  • 例如:一个不可能实现的接口,会抛出一个“NotSupportException”的异常。

  • 使用通过的FrameWork异常:在开发过程中,可能会抛出“NotImplementedExcetion”的异常。

  • 还可以从系统异常中派生出自己的具体异常,为具体的应用程序所使用。

错误处理DEMO

  • 我们可以通过一个小DEMO来对上面的异常处理过程进行一个初步的了解
string userInput
while(true)
{
    try
    {
        Console.WriteLine("请输入0-5之间的数字,或按Enter键退出。");
        Console.ReadLine();
        if (userInput == "")
            break;
        int index = Convert.ToInt32(userInput);
        if (index < 0 || index > 5)
            throw new IndexOutOfRangeException("您输入的" + userInput)
        Console.WriteLine("您的数字是:" + index);
    }
    catch(IndexOutOfRangeException ex)
    {
        Console.WriteLine("Indexoutof异常:" + "数字必须是0-5之间的" + ex.Message)
    }
    catch(Exception ex)
    {
        Console.WriteLine("错误是:" + ex.Message);
    }
    finally
    {
        Console.WriteLine("谢谢您的使用!");
    }
}

一些常用的异常类

文章的最后我们总结一些常用的异常类,其中一些具体的和比较常用的异常类我们需要展开详细的熟悉一下。

  • SystemException与ApplicationException类
    他们是Exception的直接派生类中最常用的两个。前者是System命名空间中所有的其他异常类的基类,后者则是表示应用程序发生非致命错误时所引发的异常。

  • 与参数有关的异常类
    [ArgumentException][6]与[FormatException][6]类则表示由于传递给方法成员的参数发生错误而引起的异常。

  • 与成员访问有关的异常类
    [MemberAccessException][6]表示访问类的成员失败所产生的异常。
    其中包括的直接派生类有:[FieldAccessException][6]、[MethodAccessException][6]、[MissingMemberException][6]

  • 与数组有关的异常
    这就是我们最为常用的[IndexOutOFRangeException][6]异常类,具体的用法不在赘述。

  • IO操作的异常类
    由于对这里没有过多的认识,所以就不再介绍了。

  • 与算术有关的异常类
    [ArithmeticException][6]表示与算术有关的异常类。其派生类有:[DivideByZeroException][6]、[NotFiniteNumberException][6]这辆个派生类从字面都可以非常清楚的理解他们的用法和用处,就不在过赘述了。

总结

通过对程序中异常的处理,可以使我们的代码更加严谨,也可以让我们最终做出来的程序更加的“友好”,因为没有人能够保证自己的程序不出现错误(更别说异常),为了做一个负责人的程序员,每当程序出错时不要将异常处理草草了之,一定要将它们分门别类的考虑周全,确保我们的产品能够给用户或者测试人员一个合理的解决方案!

你可能感兴趣的:(●C#(C,Sharp))