【问题标题】:Catch exception thrown by setter of entity捕获实体设置器抛出的异常
【发布时间】:2018-07-01 19:42:42
【问题描述】:

我正在尝试捕获实体设置器抛出的异常。

假设我有类 Player,并且想要保存他的进度并拥有

private float progess

我希望它介于 0 和 1 之间。我有 setter

public void setProgress(float progress){
  if( progress < 0.0f || progress > 1.0f ) throw new IllegalArgumentException("progress parameter has to be between 0.0 and 0.1");
  this.progress = progress;
}

我应该在哪里捕获这个异常?我正在尝试使用

   try{
    playerDao.save(player)
   }catch(IllegalArgumentException e){
    ... 
   }

但这并没有抓住它。我在哪里或如何捕捉它,以便我可以记录它等等?感谢您的帮助。

【问题讨论】:

  • 你不应该捕获这样的异常。这是一个错误。因此,如果它被抛出,您应该修复尝试传递无效参数的代码。也就是说,如果捕获它是个好主意,try 块应该包含对 setter 的调用。 playerDao.save(player) 没有调用那个setter方法,所以不会抛出异常,因此无法被捕获。
  • 但是如果这是某种 REST API 怎么办?并且用户会发布超过 1.0 或小于 0.0 的进度,那么我应该如何处理它
  • 如果是外部 API,您不想抛出 IllegalArgumentException。验证 API 中的参数并返回合适的值或抛出某种特定的异常,您或您正在使用的框架可以捕获并转换为有用的东西。而且您只能捕获在 try 块中引发的异常。您的 try 块不包含对 setProgress 的调用,因此不会在此处引发异常并且无法捕获该异常。

标签: java spring exception exception-handling


【解决方案1】:

必须将 setter 方法包​​装在 try-catch 块中,以便抛出/捕获异常。例如:

float progress = 2F; // example to throw the exception

try 
    setProgress(progress);
} catch (IllegalArgumentException e) {
    // if you're here, progress < 0 or progress > 1
    // TODO handle the exception
}

也就是说,这有什么用例?重构你的代码会更好,这样setProgress 方法只能接收一个有效的参数。例如:

float progress = 2F;

if (isValid(progress)) {
    setProgress(progress);
} else {
    // TODO show the user a message, etc.
}

...

private void isValid(float progress) {
    return (progress >= 0F && progress <= 1F);
}

private void setProgress(float progress) {
    this.progress = progress;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 2016-02-17
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 2017-10-14
    • 2011-05-07
    相关资源
    最近更新 更多