如何使用例外?

时间:2015-07-29 23:33:29

标签: c# exception

以下是我编写的代码,用于了解异常处理的工作原理:

using System;
using System.IO;

class ExceptionHandling
{
    public static void Main()
    {
        try
        {
            StreamReader streamReader = new StreamReader("C:\\Sample Files\\Data.txt");    
            Console.WriteLine(streamReader.ReadToEnd());
            streamReader.Close();
        }
        catch (Exception ex)    
        {                       
            Console.WriteLine(ex.Message);       
            Console.WriteLine(ex.StackTrace);    

        }
    }
}

我了解try块,但我很难理解catch块的工作原理。我知道Exceptionclassex.Message是例外消息。

  • 我的问题是ex是什么?如果这是一个对象,那么我们如何在没有实例化的情况下使用?将Exception ex放入catch的参数中会做什么?
  • 最后是trycatch方法?如果是,那么它们是否在System名称空间?

3 个答案:

答案 0 :(得分:5)

exException类型的变量。

当其他地方的代码失败时,它会执行throw new Exception("some message here");

之类的操作

throw关键字导致异常(由new创建)在堆栈中向上传递,如果它到达catch,则该代码将以ex执行指向那个异常对象。

throwtrycatch不是功能,而是关键字。它们是foreachif等语言功能。

答案 1 :(得分:4)

ex是一个引用异常对象的变量,该异常对象由引发异常的对象,其依赖项之一或.NET运行时实例化。

您可以像任何对象一样创建自己的异常,然后抛出它们:

var myException = new MyCustomException(/*...*/);
throw myException;

try-catch是一个语句,它是C#语言语法的一部分。

如果您不需要访问处理代码中的任何成员,catch部分不需要引用异常变量。以下是有效的语法:

try {
    // some code that might throw IO exception
catch (IOException) {
    Console.WriteLine("Exception thrown.");
}

奖金提示:

答案 2 :(得分:2)

如果代码在任何地方崩溃,因为有人已实例化并抛出(C#throw关键字)Exception的实例(很可能是InvalidOperationException这样的子类型)。

如果在try内引发此异常,catch将尝试通过检查是否可以从Exception(所有.Net异常都这样做)派生它来处理它。

如果定义一个变量来保存catch块上的异常实例,运行时将为其分配异常。

因此运行时将ex设置为发生的异常。看看使用Debugger查看有关它的更多信息。

你可以像这样处理特定的例外:

catch (NullReferenceException nre) { HandleNRE(nre); } //nre will be a NullReferenceException 
catch (InvalidOperationException ioe) { HandleIOE(ioe); } //ioe will be an InvalidOperationException 
catch (Exception e) { HandleEverythingElse(e); } //e will be whatever was thrown.

你也可以拥有没有ex的catch块,例如

catch (NullReferenceException) { /* Do nothing, who cares about nulls. */ }