1

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

3 回答 3

1

仅从您的代码来看,您实际上并没有throw zeroMessage .

如果你想拦截DivideByZeroException,那么这就是你必须做的。

摆脱zeroMessage类型,因为它与此处的结果无关,并将 catch 代码更改为:

catch (DivideByZeroException e)
{
    ...

请注意,运行时中的代码将抛出运行时编译时已知的异常。它不会神奇地发现你想用一些例外来代替你自己的。在代码中捕获“x / 0”问题的唯一方法是捕获DivideByZeroException,而不是通过发明自己的异常类型。

于 2013-06-08T19:55:27.767 回答
1

当你试图划分 CLR 时会抛出 type 的异常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.
}

然而,除了教育目标之外,这种例外没有任何意义。

于 2013-06-08T19:57:32.360 回答
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);
} 
于 2013-06-08T19:55:46.623 回答