替代导数方法例外的问题

时间:2013-06-08 19:43:07

标签: c#

我正在尝试理解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();
    }
}

3 个答案:

答案 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)

DivideByZeroExceptionzeroMessage类都来自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);
}