异常实现的Java语言最佳解决方案

时间:2018-03-26 12:18:20

标签: java

我需要在我的应用程序中扩展Exception类,然后遇到了一种情况。

My Parent Exception类,带有一个httpCode setter / getter,用于将异常转换为http错误代码:

abstract class ParentException
{
    private int httpCode;

    protected ParentException()
    {
        this("");
    }

    public ParentException(String message)
    {
        super(message);
    }

    protected ParentException(Exception e)
    {
        super(e);
    }

    public int getHttpCode()
    {
        return httpCode;
    }

    public void setHttpCode(int httpCode)
    {
        this.httpCode = httpCode;
    }
}

子类:     公共类AccessDeniedException扩展ParentException     {         public AccessDeniedException()         {             此("&#34);         }

    public AccessDeniedException(String message)
    {
        super(message);
        setHttpCode(HttpCodes.HTTP_CODE_403_FORBIDDEN_UNAUTHORIZED);
    }

    public AccessDeniedException(Exception e)
    {
        super(message);
        setHttpCode(HttpCodes.HTTP_CODE_403_FORBIDDEN_UNAUTHORIZED);
    }
}

类似地,我为各种相关的http代码提供了许多其他异常实现。我不喜欢的是setHttpCode()方法在两个地方。我想从一个构造函数中调用它。

我可以在所有类中只有一个构造函数如下(当然我需要同样修复父类):

public class AccessDeniedException extends ParentException
{
    public AccessDeniedException()
    {
        this("");
    }

    public AccessDeniedException(String message)
    {
        this(message, null);
    }

    public AccessDeniedException(Exception e)
    {
        this("", e);
    }

    public AccessDeniedException(String message,Exception e)
    {
        super(message, e);
        setHttpCode(HttpCodes.HTTP_CODE_403_FORBIDDEN_UNAUTHORIZED);
    }
}

但我担心如果调用只有消息或异常的构造函数,则根Exception或Throwable类可能无法正确实例化。你觉得这种方法有什么问题吗?如果没有,那么更好的方法是什么。

2 个答案:

答案 0 :(得分:2)

一种方法是在基类中使用:

protected abstract int getHttpCode();

然后每个儿童班都需要一个:

@Override
protected getHttpCode() {
    return HttpCodes.HTTP_CODE_403_FORBIDDEN_UNAUTHORIZED;
}

答案 1 :(得分:1)

如果你这样做,第二种方式你应该传递import pandas as pd import matplotlib.pyplot as plt Monthly_Return2017 = Monthly_Return2017.reset_index() Monthly_Return2016 = Monthly_Return2016.reset_index() fig, ax = plt.subplots() Monthly_Return2017['Close'].plot(ax=ax) Monthly_Return2016['Close'].plot(ax=ax) 作为空和null构造函数的消息。

第二种方法可行,但您可能会看到与第一种方法相比略有不同的输出,因为一些Exception构造函数以不同的方式填充Throwable

此处所述的问题与detailMessage的{​​{1}}扩展名相同。他们以与你的第一个例子相同的方式解决它。

在这两个中,我建议使用你的第一个例子,因为它遵循既定的约定,如果超类行为发生变化,则设计更健壮。

编辑 - M. Prokhorov指出应该有一个抽象的getter方法,这种方法可行并且是更好的设计。除此之外,我建议将httpCode包含在Parent的构造函数中。

e.g。

Exception

您还可以将代码提取到常量(静态最终)变量。