Обрабатывать исключение базового класса - PullRequest
3 голосов
/ 05 апреля 2011

У меня есть следующий сценарий C # - мне нужно обработать исключение в базовом классе, которое на самом деле происходит в производном классе.Мой базовый класс выглядит следующим образом:

public interface A
{
    void RunA();
}
public class Base
    {
        public static void RunBase(A a)
        {
            try
            {
                a.RunA();
            }
            catch { }
        }
    }

Производный класс выглядит следующим образом:

public class B: A
{
        public void RunA()
        {
            try
            {
                //statement: exception may occur here
            }
            catch{}
    }
}

Я хочу обработать исключение, скажем, исключение C, которое происходит в B (в// утверждение выше).Часть обработки исключений должна быть написана в базовом классе catch внутри RunBase.Как это можно сделать?

Ответы [ 4 ]

6 голосов
/ 05 апреля 2011
public class Base
{
    public static void RunBase(A a)
    {
        try
        {
            a.RunA();
        }
        catch(SomeSpecialTypeOfException ex)
        { 
            // Do exception handling here
        }
    }
}

public class B: A
{
    public void RunA()
    {
        //statement: exception may occur here
        ...

        // Don't use a try-catch block here. The exception
        // will automatically "bubble up" to RunBase (or any other
        // method that is calling RunA).
    }
}
0 голосов
/ 05 апреля 2011

Просто удалите try catch из класса B, если возникнет исключение, он будет привязан к цепочке вызовов, пока не будет обработан.В этом случае вы можете обработать исключение в RunBase, используя существующий блок try catch.

Хотя в вашем примере B не является производным от вашего базового класса Base.Если вы действительно хотите обработать ситуацию, когда исключение выдается в производном классе в его родительском классе, вы можете попробовать что-то вроде:

public class A
{
    //Public version used by calling code.
    public void SomeMethod()
    {
        try
        {
            protectedMethod();
        }
        catch (SomeException exc)
        {
            //handle the exception.
        }
    }

    //Derived classes can override this version, any exception thrown can be handled in SomeMethod.
    protected virtual void protectedMethod()
    {
    }

}

public class B : A
{
    protected override void protectedMethod()
    {
        //Throw your exception here.
    }
}
0 голосов
/ 05 апреля 2011
public class B: A
{
        public void RunA()
        {
            try
            {
                // statement: exception may occur here
            }
            catch(Exception ex)
            {
                // Do whatever you want to do here if you have to do specific stuff
                // when an exception occurs here
                ...

                // Then rethrow it with additional info : it will be processed by the Base class
                throw new ApplicationException("My info", ex);
            }
    }
}

Вы также можете вызвать исключение как есть (используйте только throw).

Если вам не нужно что-либо здесь обрабатывать, не помещайте try {} catch {}, пустьисключение всплывает само по себе и обрабатывается базовым классом.

0 голосов
/ 05 апреля 2011

Как это можно сделать?

Что ты имеешь в виду? Просто удалите блок try-catch из RunA.

Сказав это, вам необходимо убедиться, что класс A знает, как обрабатывать исключение , это включает в себя его рационализацию в пользовательский интерфейс, ведение журнала, ... Это на самом деле редко для базового класса. Обработка исключений обычно происходит на уровне пользовательского интерфейса.

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