在c#自定义异常处理的情况下如何进行构造函数调用?

时间:2014-12-11 14:33:53

标签: c# exception-handling

这是我的程序

class Program
{
    static void Main(string[] args)
    {
        throw new UserAlreadyLoggedInException("Hello");
    }
}

public class UserAlreadyLoggedInException : Exception
{
    public UserAlreadyLoggedInException(string message) : base(message)
    {
        Console.WriteLine("Here");
    }    
}

现在,我知道基类构造函数在派生类构造函数之前运行。但是当我运行上面的代码时输出结果是

     Here
     Unhandled Exception:Testing.UserAlreadyLoggedInException:Hello.

为什么在“未处理......”之前打印“这里”?

4 个答案:

答案 0 :(得分:4)

首先必须创建异常,然后才能抛出异常。

  1. 创建由new UserAlreadyLoggedInException;
  2. 发起的异常实例
  3. UserAlreadyLoggedInException构造函数调用;
  4. 在构造函数内调用Console.WriteLine;
  5. 构造函数已完成;
  6. 抛出新创建的异常实例;
  7. 未处理异常,因此应用程序错误处理程序将错误写入控制台。

答案 1 :(得分:2)

为什么不试试这个:

static class Program
{
  static void Main()
  {
    throw new UserAlreadyLoggedInException("Hello");
  }
}


class LoginException : Exception
{
  public LoginException(string message) : base(message)
  {
    Console.WriteLine("least derived class");
  }
}

class UserAlreadyLoggedInException : LoginException
{
  public UserAlreadyLoggedInException(string message) : base(message)
  {
    Console.WriteLine("most derived class");
  }
}

您也可以尝试编写Main方法,如下所示:

  static void Main()
  {
    var ualie = new UserAlreadyLoggedInException("Hello");
    Console.WriteLine("nothing bad has happened yet; nothing thrown yet");
    throw ualie;
  }

因此,使用Exception关键字构建new实例并不会提升"或"扔"一个例外。你需要throwthrow语句的工作原理是首先评估throw关键字之后的表达式。该评估的结果将是对异常实例的引用。在评估表达式后,throw"抛出"表达式值引用的异常。

您的误解是Exception"爆炸"一旦实例构造函数运行到System.Exception。事实并非如此。

答案 2 :(得分:1)

如果添加自己的try / catch,程序流程就会变得更加明显。请注意,Exception的构造函数不会写任何只是存储消息字符串以供以后使用的内容。

class Program
{
    static void Main(string[] args)
    {
        try
        {
            throw new UserAlreadyLoggedInException("Hello");
        }
        catch (Exception e)
        {
            Console.WriteLine("My handled exception: {0}", e.Message);
        }
    }
}

public class UserAlreadyLoggedInException : Exception
{
    public UserAlreadyLoggedInException(string message) : base(message)
    {
        Console.WriteLine("Here");
    }    
}

答案 3 :(得分:0)

在实例化并抛出异常后,将异常打印到控制台。

实例化打印“Here”,然后运行时捕获它并打印“Unhandled Exception:”ToString()表示。