gpt4 book ai didi

c# - DAO 的类级错误处理程序

转载 作者:行者123 更新时间:2023-12-03 08:47:16 25 4
gpt4 key购买 nike

我正在使用 Entity Framework 。下面是我的 ActorsDao 类中 Actors 上下文的列表方法示例。如果您想象我的应用程序类似于 imdb,那么将有针对各种其他上下文(如电影、导演、流派、评论、工作室等)的 CRUD 方法。

无论方法或上下文如何,我都以相同的方式处理错误。由于我在许多上下文中使用了许多方法,因此我的 catch 部分始终完全相同。

显然,我可以创建一个错误处理类,将代码放在那里,然后从 catch block 中调用该类中的一个方法。

但是,我想知道是否有办法从每个方法中省略 TRY...CATCH 并为我的 Entity Framework 层中的方法设置全局错误处理程序?

我只希望这个全局错误处理程序处理这些错误,而不是来自应用程序其余部分的错误。

我似乎记得在 Java Spring 中,您可以使用方法名称注释类或方法,并且所有错误都将传递给它,而无需 TRY...CATCH。我想知道.NET(或具有此类功能的第三方库)是否有类似的东西?

    public List<Actor> ListActors()
{

List<Actor> actorList = new List<Actor>();

using (var context = new ActorContext())
{
try
{
actorList = context.Actors.ToList<Actor>();

}
catch (Exception e)
{
//Handle error code
}
}

return actorList;

}

编辑

我做了一些研究,从这里找到了这段代码 https://stackoverflow.com/a/4851985/1753877
private void GlobalTryCatch(Action action)
{
try
{
action.Invoke();
}
catch (ExpectedException1 e)
{
throw MyCustomException("Something bad happened", e);
}
catch (ExpectedException2 e)
{
throw MyCustomException("Something really bad happened", e);
}
}

public void DoSomething()
{
GlobalTryCatch(() =>
{
// Method code goes here
});
}

使用这样的代表可以吗?它当然符合我的要求。

最佳答案

您可以像这样创建一个类并从该类扩展 Controller 。

错误处理程序类如下所示:

package com.wes.essex.rest;

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;

import com.wes.essex.bean.ErrorResponse;

public class SkyNewsController {
private static final Logger LOGGER = LoggerFactory.getLogger(SkyNewsController.class);

@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleError(Exception ex) {
LOGGER.info("start");
LOGGER.error(ex.getMessage(), ex);
ErrorResponse error = new ErrorResponse();
error.setTimestamp(ZonedDateTime.now().format(DateTimeFormatter.ISO_INSTANT));
LOGGER.debug("error : {} ", error);
ResponseEntity<ErrorResponse> response = null;
if (ex instanceof ConstraintViolationException) {
error.setReasonCode(HttpStatus.BAD_REQUEST.value());
ConstraintViolationException constraintException = (ConstraintViolationException) ex;
Set<ConstraintViolation<?>> set = constraintException.getConstraintViolations();
String errorMessage = "Input Validation Failed:";
for (ConstraintViolation<?> constraintViolation : set) {
errorMessage += constraintViolation.getMessageTemplate() + ",";
}
errorMessage = errorMessage.substring(0, errorMessage.length() - 1);
error.setErrorMessage(errorMessage);
response = new ResponseEntity<ErrorResponse>(error, HttpStatus.BAD_REQUEST);
} else {
error.setReasonCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
error.setErrorMessage(ex.getMessage());
response = new ResponseEntity<ErrorResponse>(error, HttpStatus.INTERNAL_SERVER_ERROR);
}
return response;
}
}

这将是错误响应的 baean 类:
package com.wes.essex.bean;

public class ErrorResponse {

private static final long serialVersionUID = 5776681206288518465L;

private String timestamp;
private String errorMessage;
private int reasonCode;

public String getErrorMessage() {
return errorMessage;
}

public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}

public int getReasonCode() {
return reasonCode;
}

public void setReasonCode(int reasonCode) {
this.reasonCode = reasonCode;
}

public String getTimestamp() {
return timestamp;
}

public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}

public static long getSerialversionuid() {
return serialVersionUID;
}
}

关于c# - DAO 的类级错误处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51177980/

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