这是我的程序
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.
为什么在“未处理......”之前打印“这里”?
答案 0 :(得分:4)
首先必须创建异常,然后才能抛出异常。
new UserAlreadyLoggedInException
; UserAlreadyLoggedInException
构造函数调用; Console.WriteLine
; 答案 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
实例并不会提升"或"扔"一个例外。你需要throw
。 throw
语句的工作原理是首先评估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()
表示。