gpt4 book ai didi

exception-handling - 我的域异常应该从应用层抛出吗?

转载 作者:行者123 更新时间:2023-12-04 11:09:42 24 4
gpt4 key购买 nike

我正在阅读 Vaughn Vernon 的书 - 实现领域驱动设计。有一个项目管理应用程序的示例。有像 BacklogItem、Sprint 等聚合。如果我在域层定义了 BacklogItemNotFoundException。我的 Rest 适配器应该捕获它并转换为 NotFoundHttpResult 吗?或者任何其他损坏的不变异常,例如:EmailPatternBrokenException 或 TooManyCharactersForNameException 或任何应该在 Rest 适配器(端口和适配器架构)中处理并重新转换为其余响应的内容?如果是,是否意味着 RestAdapter 应该有对域层的引用?这就是困扰我的...

最佳答案

这个问题是矛盾的。如果是Domain Exception,说明是域抛出的。

无论如何,域抛出的异常应该由应用层处理。

我有一个用于命令总线的异常处理程序装饰器,它可以捕获任何域异常并将其转换为应用程序异常。

此应用程序异常被抛出到适配器。

适配器知道应用程序异常,而不是域异常。

更新

我的域异常是一个抽象基类,具体域异常从它继承

public abstract class DomainException extends RuntimeException {

private static final long serialVersionUID = 1L;

private ErrorMessage mainErrorMessage;
private List<ErrorMessage> detailErrorMessages;

protected DomainException ( List<ErrorMessage> aDetailMessages, Object... aMainMessageArgs ) {
this.mainErrorMessage = new ErrorMessage(this.getClass().getSimpleName(), aMainMessageArgs );
this.detailErrorMessages = ( (aDetailMessages==null) ? new ArrayList<ErrorMessage>() : aDetailMessages );
}

public ErrorMessage mainErrorMessage() {
return this.mainErrorMessage;
}

public List<ErrorMessage> detailErrorMessages() {
return this.detailErrorMessages;
}
}

ErrorMessage 有一个键和一个参数列表。消息位于属性文件中,其中键是具体域异常类的名称。

应用程序异常只是一种类型,它保存具体的文本消息。
public class ApplicationException extends Exception {

private static final long serialVersionUID = 1L;


private String mainMessage;
private String[] detailMessages = new String[0];


public ApplicationException ( String aMainMessage, Throwable aCause, String... aDetailMessages ) {
super ("Main Message = "+aMainMessage+" - DetailMessages = "+Utils.toString(aDetailMessages), aCause );
this.mainMessage = aMainMessage;
this.detailMessages = ( (aDetailMessages==null) ? (new String[0]) : aDetailMessages );
}


public String mainMessage() {
return this.mainMessage;
}

public boolean hasDetailMessages() {
return (this.detailMessages.length > 0);
}

public String[] detailMessages() {
return this.detailMessages;
}
}

我有一个装饰器(包装每个命令的执行)来处理域异常:
public class DomainExceptionHandlerDecorator extends Decorator {

private final DomainExceptionHandler domainExceptionHandler;


public DomainExceptionHandlerDecorator (DomainExceptionHandler domainExceptionHandler) {
this.domainExceptionHandler = domainExceptionHandler;
}


@Override
public <C extends Command> void decorateCommand(Mediator mediator, C command) throws ApplicationException {
try {
mediator.executeCommand(command);
} catch ( DomainException de ) {
this.domainExceptionHandler.handle (de);
}
}
}

我有一个域异常处理程序,它接受域异常,通过读取属性文件(TextMessageService 完成这项工作)将其转换为应用程序异常并抛出应用程序异常。
public class TranslatorDomainExceptionHandler implements DomainExceptionHandler {

private final TextMessageService configurationService;

public TranslatorDomainExceptionHandler ( TextMessageService aConfigurationService ) {
this.configurationService = aConfigurationService;
}

@Override
public void handle ( DomainException de ) throws ApplicationException {

ErrorMessage mainErrorMessage = de.mainErrorMessage();
List<ErrorMessage> detailErrorMessages = de.detailErrorMessages();

String mainMessage = this.configurationService.mensajeDeError ( mainErrorMessage );

String[] detailMessages = new String [ detailErrorMessages.size() ];

int i = 0;
for ( ErrorMessage aDetailErrorMessage : detailErrorMessages ) {
detailMessages[i] = this.configurationService.mensajeDeError ( aDetailErrorMessage );
i++;
}
throw new ApplicationException ( mainMessage, de, detailMessages);
}
}

适配器(例如 UI)将捕获应用程序异常并向用户显示其消息。但它不知道域异常。

关于exception-handling - 我的域异常应该从应用层抛出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51942769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com