java - Java用外部类扩展抽象类
问题描述
我希望有一个抽象类InitException
来表示一组类,即StartParameterException
,FileNotFoundException
等。我StartParameterException
自己定义,但这FileNotFoundException
是我导入的标准例外。所以我不能extends InitException
像我自己的类那样添加它的定义:
public class StartParameterException extends InitException {
...
}
关键是要改变这一点:
try {
...
} catch (StartParameterException | FileNotFoundException | InvalidPathException | NullBoardException e) {
System.out.println(e);
System.exit(INIT_ERROR);
}
对此
try {
...
} catch (InitException e) {
System.out.println(e);
System.exit(InitException.ERROR_CODE);
}
这可能吗?我应该以某种方式使用接口吗?
解决方案
另一种方法是创建一个enum
受支持的异常类型并添加一些处理每个异常所需的上下文,如下所示:
public enum ExceptionEnum {
START_PARAMETER_EXCEPTION(StartParameterException.class, "Start parameter exception occurred", 1),
FILE_NOT_FOUND_EXCEPTION(FileNotFoundException.class, "Required file is not found", 2),
INVALID_PATH_EXCEPTION(InvalidPathException.class, "Given path is not valid", 3),
NULL_BOARD_EXCEPTION(NullBoardException.class, "Null board exception occurred", 4);
private Class exceptionClass;
private String errorMessage;
private int exitCode;
public Class getExceptionClass() {
return exceptionClass;
}
public String getErrorMessage() {
return errorMessage;
}
public int getExitCode() {
return exitCode;
}
ExceptionEnum(Class exceptionClass, String errorMessage, int exitCode) {
this.exceptionClass = exceptionClass;
this.errorMessage = errorMessage;
this.exitCode = exitCode;
}
public static ExceptionEnum fromExceptionClass(Class clazz) {
for (ExceptionEnum exceptionEnum : ExceptionEnum.values()) {
if (exceptionEnum.getExceptionClass().isAssignableFrom(clazz)) {
return exceptionEnum;
}
}
return null;
}
}
可以为每个异常添加更多上下文,这样可以更好地控制在运行时如何处理单个异常:
try {
//....
} catch (Exception e) {
ExceptionEnum exceptionEnum = ExceptionEnum.fromExceptionClass(e.getClass());
if(exceptionEnum != null) {
System.out.println(exceptionEnum.getErrorMessage());
System.exit(exceptionEnum.getExitCode());
}
}
推荐阅读
- python - GeoDjango:将坐标沿给定方向移动固定距离(例如,将点向东移动一英里)
- autodesk-forge - 无法将文件填充到照片场景中 - 错误代码=4 msg=尚未实现
- c# - 获取 WCF 调用的原始 HTTP 响应
- excel - 如何从excel中查找的范围中计数
- pyspark-sql - 无法使用 pyspark.sql 执行内部联接
- android - 蓝牙电池电量 API getBatteryLevel() 在 Android 8.1.0 中不起作用
- sql - 如何在 SQL Server 中指定条件 DEFAULT 约束?
- autodesk-forge - 在 BIM 360 Docs 中获取文件夹内容时文件的显示名称不可用
- angular - 如何在 Angular 5 中使用 $q.all 和 $q.defer?
- prestashop - PrestaShop - 在其他结帐步骤中获取购物车内容