我想要一些关于以下情况的反馈:
一个方法构造一个对象,但是在构造它时所做的一些工作可能会失败。这将导致对象丢失一些数据。我想让这个方法的用户能够处理对象(如果完成的话),但也能处理对象(如果不完整的话),同时还能处理抛出的异常。
用例:
我正在将一个文件从磁盘读入pojo,一些文件属性(如datecreated)在从操作系统读取时会引发异常。在这种情况下,我抛出一个自定义异常,但我也希望用户能够处理不完整的文件表示(pojo)。
我的解决方案:
我使用了一个自定义异常来 Package 抛出的异常和不完整的对象。
我的代码:
public FileDto getFromFile(File f) throws IncompleteFileDtoException {
FileDto dto = new FileDto();
dto.setName(f.getName());
dto.setPath(f.getAbsolutePath());
dto.setDirectory(f.isDirectory());
dto.setSize(f.length());
dto.setModifiedAt(f.lastModified());
try {
BasicFileAttributes attr = Files.readAttributes(f.toPath(), BasicFileAttributes.class);
dto.setCreatedAt(attr.creationTime().toMillis());
}
catch(Exception e)
{
throw new IncompleteFileDtoException("Unable to transform " +f.getAbsolutePath() + " to DTO.", e, dto );
}
return dto;
}
public static class IncompleteFileDtoException extends Exception
{
private FileDto fileDto;
public IncompleteFileDtoException(String message, Exception e, FileDto fileDto)
{
super(message,e);
this.fileDto = fileDto;
}
public FileDto getFileDto() {
return fileDto;
}
}
这个代码会有什么负面影响?
2条答案
按热度按时间x33g5p2x1#
您的示例只包含一个可能导致问题的值,但是一旦您有多个值,您就会得到一个安静的复杂代码,因为如果应该抛出这样的异常,您必须保留信息。
就个人而言,一个更好的方法可能是,如果处理失败,只设置合适的默认值(如果不只是一个空值),但初始化该特定值是可以的。如果一个值可以是空的,你可以直接抛出整个异常。如果您需要知道在安装过程中是否有问题,请在该对象中添加一个标志,该标志将给出某些失败的信息,可以检查。这还允许您传递对象,而不会在后续类中丢失该信息,等等。
简而言之:异常应该只表示异常情况,即对象不能被使用,而不是表示预期的情况
ncgqoxb02#
我提供给你使用
Builder
图案。创建FileDtoBuilder
把它放进例外。当您成功读取文件时,会创建FileDto
已存在的示例FileDtoBuilder
.四人帮设计图ernshttps://en.wikipedia.org/wiki/builder_pattern