繁体   English   中英

合同与例外

[英]Contracts vs Exceptions

假设我有以下代码:

public class MainClass {
    public static void main(String[] args) {
        System.out.println(sumNumbers(10, 10));
    }

    //@requires a >= 10;
    //@ensures \result < 0;
    public static int sumNumbers(int a, int b) {
        return a+b;
    }
}

我可以在这里做两件事:

使用代码合同(在这种情况下,注释中的内容)。 运行sumNumbers且<10时,它将立即引发异常(尽管它似乎不是很描述):

Exception in thread "main" org.jmlspecs.jmlrac.runtime.JMLInternalNormalPostconditionError: by method MainClass.sumNumbers
    at MainClass.sumNumbers(MainClass.java:500)
    at MainClass.internal$main(MainClass.java:9)
    at MainClass.main(MainClass.java:286)

要么...

引发异常。 异常可以像我想要的那样描述。 我还要检查函数的末尾以查看发布条件是否正确。

您在这里使用哪个?为什么?

我喜欢代码契约的想法,但是描述性的IllegalArgumentException (或类似内容)为我提示了它。 在支持/生产角色(甚至是开发人员)中获得明确的异常消息要清楚得多,这可以使您从诊断中抢先一步,出了什么问题(系统是否损坏,或者在开发过程中是否滥用了API) )。

您是否希望在程序正常运行期间将无效输入传递给此参数? 如果是,您能从中恢复吗?

如果是这样,检查异常是解决方法。

如果您无法从这种情况下恢复过来,则一定要使它成为合同并大声失败-但无论哪种情况,我都将使用描述性错误消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM