我有以下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(在//语句上面)。 异常处理部分应该写在RunBase内的基类catch中。怎么办呢?
答案 0 :(得分:6)
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).
}
}
答案 1 :(得分:0)
你是什么意思? 只需从如何做到这一点?
try-catch
移除 RunA
块。
话虽如此,你需要确保A类知道如何处理异常,这包括将其简化为UI,记录,......这实际上是罕见对于基类。处理异常通常发生在UI级别。
答案 2 :(得分:0)
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 {},让异常自行冒泡并由Base类处理。
答案 3 :(得分:0)
只需从类B中删除try catch,如果发生异常,它将正确调用调用链,直到它被处理完毕。在这种情况下,您可以使用现有的try catch块在RunBase中处理异常。
虽然在你的例子中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.
}
}