我正在尝试理解System.Exception
类,我在覆盖功能方面遇到了一些问题。我尝试拦截DivideByZero
的异常并写出我在System.Exception
衍生类函数中生成的用户消息。这是我的代码:
public class zeroDivision
{
public void Deleter()
{
double z; int i = 0;
try
{
z = 10 / i;
Console.WriteLine("N={0} i={1} Result={2}", 10, i, z);
}
catch (zeroMessage e) **<====problem here: DivideByZeroException**
{
Console.WriteLine("N={0} i={1} Result={2}", 10, i, e.Message);
}
}
}
public class zeroMessage : System.Exception <--here debugger even doesn't come
{
public override string Message
{
get
{
string msg = base.Message;
msg = "Деление на ноль ЗАПРЕЩЕНО!!!";
return msg;
}
}
}
class Program
{
static void Main(string[] args)
{
zeroDivision zero = new zeroDivision();
zero.Deleter();
Console.Read();
}
}
当我打电话:catch(zeroMessage e) - 它未处理,但如果我打电话:catch(例外e) - 它可以工作。我的错在哪里?我不明白
-------------------------------
在论坛大师的一些帮助下,我用工作函数重新完成了这项任务。也许这对任何人都有用:
public class zeroDivision
{
public void Deleter() //First way
{
double z; int i = 0;
try
{
z = 10 / i;
Console.WriteLine("N={0} i={1} Result={2}", 10, i, z);
}
catch (DivideByZeroException)
{
Console.WriteLine("N={0} i={1} Result={2}", 10, i, "Делить на ноль НИЗЗЯ!!!");
}
}
public double Deleter2(int a, int b) //Second way
{
if (b == 0) throw new zeroMessage();
return a / b;
}
public void prn(int i, int j) //Third way
{
try
{
Console.WriteLine(Deleter2(i, j));
}
catch (zeroMessage z)
{
Console.WriteLine(z.Message);
}
}
public void firstDeleter() //Updated Yesterday's code - Forth way
{
double z; int i = 0;
try
{
if (i == 0) throw new zeroMessage(); //!!!
z = 10 / i;
Console.WriteLine("N={0} i={1} Result={2}", 10, i, z);
}
catch (zeroMessage e)
{
Console.WriteLine("N={0} i={1} Result={2}", 10, i, e.Message);
}
}
}
public class zeroMessage : System.Exception
{
public override string Message
{
get
{
string msg = base.Message;
msg = "Деление на ноль ЗАПРЕЩЕНО!!!";
return msg;
}
}
}
class Program
{
static void Main(string[] args)
{
zeroDivision zero = new zeroDivision();
zero.Deleter();
try
{
double result = zero.Deleter2(10, 0);
Console.WriteLine(result);
}
catch (zeroMessage z)
{
Console.WriteLine(z.Message);
}
zeroDivision zero1 = new zeroDivision();
zero1.prn(10, 0);
zeroDivision zero2 = new zeroDivision();
zero2.firstDeleter();
Console.Read();
}
}
答案 0 :(得分:1)
仅凭您的代码判断,您实际上没有抛出 zeroMessage
。
如果你想拦截DivideByZeroException
,那么你就必须这样做。
删除zeroMessage
类型,因为它与此处的结果无关,并将catch代码更改为:
catch (DivideByZeroException e)
{
...
请注意,运行时代码将在编译运行时时将异常 known 抛出到运行时。它不会神奇地发现你想用自己的替代一些例外。在代码中捕获“x / 0”问题的唯一方法是捕获DivideByZeroException
,而不是通过发明自己的异常类型。
答案 1 :(得分:1)
当您尝试划分CLR时,会抛出DivideByZeroException
类型的异常。
CLR无法知道您想要抛出其他异常。
但是如果你想玩你的新例外,你可以这样做:
public double Divide(int a, int b)
{
if(b == 0) throw new zeroMessage();
return a /b;
}
并使用它:
try
{
var result = Divide(10, 0);
}catch(zeroMessage exc)
{
//here you will catch your exception.
}
然而,除了教育目标外,没有任何意义。
答案 2 :(得分:0)
DivideByZeroException
和zeroMessage
类都来自System.Exception
。但是,这并不意味着DivideByZeroException
来自zeroMessage
!
你想要达到什么目的?如果您想捕获所有可能的异常,请使用System.Exception
,当您对特定异常感兴趣时,请使用DivideByZeroException
等等:
double z; int i = 0;
try
{
z = 10 / i;
Console.WriteLine("N={0} i={1} Result={2}", 10, i, z);
}
catch (DivideByZeroException e)
{
Console.WriteLine("N={0} i={1} Result={2}", 10, i, e.Message);
}
catch(Exception e)
{
Console.WriteLine("Unexpected error: ", e.Message);
}