如果数学函数中的零在算术表达式中因参数错误而下降,它如何保护 nil

How guard nil in math function if it drops with bad argument in arithmetic expression

提问人:Dan 提问时间:10/27/2023 更新时间:10/30/2023 访问量:36

问:

尝试弄清楚,在生成 GQL 模式时, 为什么如果源 var 中的数据存在(比如说), 没有错误 但如果是 NIL,则代码会生成错误 当我用这样的代码转换价值时::floatsquare_plot50

可能似乎没有验证通过

法典

field(:square_plot, :float)     // my var is `50.0` in DB

field :square_plot_ft, :float do
  if square_plot > 0 do
    resolve(fn _args, %{source: source} -> {:ok, Float.round(source.square_plot*10.7639, 0)} end)
  end
end

if value NOT NIL GQL 响应

{
    "data": {
        "unit": {
            "squareTotalFt": 1615.0,
            "squareTotal": 150.0,
            "squarePlotFt": 538.0,
            "squarePlot": 50.0
        }
    }
}

如果 value 为 NIL,则表示 GQL 响应

"Internal server error"

和服务器 ERR

** (exit) an exception was raised:
    ** (ArithmeticError) bad argument in arithmetic expression
        (platform) lib/units_web/schema/object.ex:228: anonymous fn/2 in UnitsWeb.Schema.Unit.__abs
inthe_type__/1
Graphql Elixir ecto Erlang

评论


答:

0赞 Aleksei Matiushkin 10/27/2023 #1

令人惊讶的是,在 中,因此在 中,比较/涉及不同类型的比较是合法的。<>

更令人惊讶的是,任何原子都大于任何数字(请参阅文档中的原子排序)。

nil > 0
#⇒ true

然后我们进入 ,尝试哪个是 ,这显然会提高。ifsquare_plot*10.7639nil*10.7639

正确的代码是:

field :square_plot_ft, :float do
  if is_number(square_plot) and square_plot > 0 do
    resolve(...)
  end
end