java—从引发异常的方法返回部分不完整的结果

bkhjykvo  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(298)

我想要一些关于以下情况的反馈:
一个方法构造一个对象,但是在构造它时所做的一些工作可能会失败。这将导致对象丢失一些数据。我想让这个方法的用户能够处理对象(如果完成的话),但也能处理对象(如果不完整的话),同时还能处理抛出的异常。
用例:
我正在将一个文件从磁盘读入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;
    }
}

这个代码会有什么负面影响?

x33g5p2x

x33g5p2x1#

您的示例只包含一个可能导致问题的值,但是一旦您有多个值,您就会得到一个安静的复杂代码,因为如果应该抛出这样的异常,您必须保留信息。
就个人而言,一个更好的方法可能是,如果处理失败,只设置合适的默认值(如果不只是一个空值),但初始化该特定值是可以的。如果一个值可以是空的,你可以直接抛出整个异常。如果您需要知道在安装过程中是否有问题,请在该对象中添加一个标志,该标志将给出某些失败的信息,可以检查。这还允许您传递对象,而不会在后续类中丢失该信息,等等。
简而言之:异常应该只表示异常情况,即对象不能被使用,而不是表示预期的情况

ncgqoxb0

ncgqoxb02#

我提供给你使用 Builder 图案。创建 FileDtoBuilder 把它放进例外。当您成功读取文件时,会创建 FileDto 已存在的示例 FileDtoBuilder .
四人帮设计图ernshttps://en.wikipedia.org/wiki/builder_pattern

相关问题