bro*_*179 6 matlab assert exception-handling
由于Matlab被解释,通常会在执行函数签名的函数开头花费大量时间.例如
if nargin ~= 2; error('must provide two input args a and b'); end
if a < 0||a ~=floor(a); error('input arg1 must be positive non-zero integer'); end
if ~isa(b,'cell') ...
Run Code Online (Sandbox Code Playgroud)
相反,使用Matlab的assert()会更好吗?如果没有,何时适合在Matlab中使用assert()?
有对在生产中使用代码断言的大讨论在这里,但我不能肯定这适用于解释的代码.同样,这里有另一个很好的讨论,我同意@Dan Dyer关于断言表达对当前状态的看法.然而,在这里看一下类似的Python讨论人们说,只使用断言来应对永远不会发生的情况(例如异常情况的异常),这与之前的引用有点矛盾.
也许这更像是一个关于断言在解释语言中扮演的角色的问题,而不是关于Matlab的问题.
在大多数情况下,两者之间没有区别
assert(X,...)
Run Code Online (Sandbox Code Playgroud)
和
if (~X)
error(...)
end
Run Code Online (Sandbox Code Playgroud)
您在它们之间的选择取决于便利性或风格。
基于 MATLAB 的项目中非生产代码和生产代码之间的区别通常与基于其他语言的项目中的区别不同。
正如您所说,这部分是因为 MATLAB 通常是解释型而不是编译型;尽管可以使用 MATLAB Compiler 或 Builder 产品生成应用程序,但这些应用程序虽然不是严格“编译”的,但没有可见的源代码并且无法调试。对于这类应用程序,您需要像处理编译语言一样仔细地处理异常和错误。
部分原因是“生产”对于使用 MATLAB 的项目与使用其他语言的项目来说通常意味着不同的东西;例如,这可能意味着 MATLAB 代码会自动转换为 C 语言以部署到汽车发动机控制器,或者可能意味着某些 MATLAB 代码正在运行财务预测模型并将结果写入生产数据库。
有一种特殊情况,assert应使用 而不是if..error..end,即当您使用 MATLAB Coder 从 MATLAB 代码生成 C 代码时。MATLAB Coder 检查assertMATLAB 代码中的语句,以推断需要转换为 C 语言的变量的属性,如果它可以假设有关您断言的变量的事实(例如数组大小和类型),则可以生成更好的 C 代码。
最后一点:对于您提到的特定活动,强制执行函数签名,我不会使用这两种方法 -inputParser通常更健壮和一致(尽管有点冗长),但更重要的是,它鼓励您在第一个中很好地设计函数签名地方。
| 归档时间: |
|
| 查看次数: |
4196 次 |
| 最近记录: |