我想在某种情况下进行一些反馈:
一种方法构建一个对象,但是在构造时完成的某些工作可能会失败。这将导致缺少某些数据的对象。我想为此方法提供处理对象的能力,如果完成了,也可以处理对象,同时也能够处理抛出的异常。
用例:
我正在将磁盘中的文件读取到pojo中,而创建的日期之类的某些文件属性在从操作系统中读取时会引发异常。在这种情况下,我要抛出自定义异常,但我也希望用户能够处理该不完整的文件表示(POJO)。
我的解决方案:
我使用了一个定制异常,该异常包裹了抛出的异常和不完整的对象。
我的代码:
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;
}
}
此代码会有什么负面影响?
您的示例只包含一个可能导致问题的值,但是一旦您有多个值,您最终会带有安静的复杂代码,因为如果这样的例外,则必须保留信息应该扔。
个人一个更好的方法可能是仅设置拟合默认值(如果不仅是null),如果处理失败,但对于该特定值的初始化是可以的。而且,如果可以的值可以为null,那么您只能进行整个异常。如果您需要在设置过程中是否存在问题,请在该对象中添加标志,如果可能会被嘲笑的东西,则提供信息。这也可以使您可以在不丢失后续课程的情况下传递对象,等等。
。简而我为您提供使用Builder
模式。确实创建FileDtoBuilder
并将其置于例外。当您成功读取文件时,DO创建FileDto
实例来自现有的FileDtoBuilder
。
四种设计模式的帮派https://en.wikipedia.org/wiki/builder_pattern