c # исключительные вопросы - PullRequest
2 голосов
/ 12 января 2012

Спасибо всем за помощь.

Этот код не дает того, что я ожидаю, когда делитель равен 1. Базовый класс для ExceptOne не вызывается, гиперссылка в ExceptOne не отображается,Чего мне не хватает?
base ctor2
http: // exc2.com
Writeline in finally

class Program
{
    static void Main(string[] args)
    {
        try
        {
            byte y = 0;
            byte x = 10;
            Console.WriteLine("enter a divisor");
            string s = (Console.ReadLine());
            y = Convert.ToByte(s);
            if (y == 1) throw new ExceptOne();
            Console.WriteLine("result is {0}", x / y); ;
        }

        catch (System.DivideByZeroException e)
        {
            Console.WriteLine("exception occured {0}...", e.Message);
        }

        catch (ExceptOne p)
        {
            Console.WriteLine(p.Message +"\n"+ p.HelpLink);

        }

        catch (System.Exception r)
        {
            Console.WriteLine(r.Message + "\n" + r.HelpLink);
        }

        finally
        {
            Console.WriteLine("Writeline in finally ");
            Console.ReadLine();
        }
    }
}

public class ExceptOne : System.Exception
{
    public ExceptOne()
        : base("base ctor 1 ")
    {
        this.HelpLink = "http://exc1.com";
        Console.WriteLine("WriteLine exception 1...");
        throw new Exception2();
    }
}

public class Exception2 : System.Exception
{
    public Exception2()
        : base("base ctor2 ")
    {
        Console.WriteLine("WriteLine exception 2...");
        this.HelpLink = "http://exc2.com";
    }
}

Ответы [ 3 ]

4 голосов
/ 12 января 2012

Вы вызываете исключение в конструкторе исключения ExceptOne. Таким образом, объект ExceptOne никогда не будет создан, и перехват этого исключения не сработает.

EDIT

Можно сгенерировать исключение в конструкторе. См .: http://bytes.com/topic/c-sharp/answers/518251-throwing-exception-constructor и Когда для конструктора правильно генерировать исключение?

1 голос
/ 12 января 2012

Если вы видите, что когда вы вызываете исключение ExceptOne в конструкторе, вы генерируете исключение нового типа Exception2, которое не перехватывается в вашем методе Main(...), и, следовательно, оно попадает в предложение общего исключения.

0 голосов
/ 12 января 2012

Это происходит потому, что вы выбросили Exception2 в ExceptOne, в результате чего Exception2 был перехвачен в вашем основном методе блоком (System.Exception r).

Вызывается база для ExceptOne, сообщение (установленное базой ("base ctor 1")) просто никогда не отображается, потому что это исключение никогда не перехватывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...