Error handling 了解Erlang ODBC应用程序

Error handling 了解Erlang ODBC应用程序,error-handling,erlang,odbc,Error Handling,Erlang,Odbc,我正在使用Erlang ODBC连接到一个DB源。我的代码如下所示: main() -> Sql = "SELECT 1", Connection = connect(), case odbc:sql_query(Connection, Sql) of {selected, Columns, Results} -> io:format("Success!~n Columns: ~p~n Results: ~p~n", [Columns

我正在使用Erlang ODBC连接到一个DB源。我的代码如下所示:

main() ->
  Sql = "SELECT 1",
  Connection = connect(),
  case odbc:sql_query(Connection, Sql) of 
    {selected, Columns, Results} ->
      io:format("Success!~n Columns: ~p~n Results: ~p~n",
        [Columns, Results]),
      ok;
    {error, Reason} ->
      {error, Reason}
  end.

connect() ->
  ConnectionString = "DSN=dsn_name;UID=uid;PWD=pqd",
  odbc:start(),
  {ok, Conn} = odbc:connect(ConnectionString, []),
  Conn.
现在没事了。但至少在我的查询中,我如何处理错误呢?据我所知,它包含在
{error,Reason}
中,但当出现问题时,如何输出它?我试图像第一个子句那样添加io:format,但它不起作用


第二,不幸的是,我找不到任何能够很好地解释语法的参考,我不明白这段代码中的
ok
是什么意思(第一行8,第二行16。如果我是对的,它只意味着连接是ok的,并且这个变量没有赋值?但在第8行它意味着什么?

所以我找到了一些东西。{error,Reason}包含连接错误,这意味着我们指定了错误的DSN名称等。关于我提供的捕获查询错误,我们可以从Erlang引用中读取:

Gaurds所有API函数都受到保护,如果您传递的参数为 错误的类型将导致运行时错误。将所有输入参数设置为 相信内部函数是正确的。这是一个很好的编程 练习仅不信任来自真正外部来源的输入。你是 不应该捕获这些错误,它只会使代码非常复杂 凌乱且复杂得多,这会在 最坏的情况也掩盖了实际的故障。全力以赴 相反,您应该信任自己的输入


这意味着我们应该小心我们写的东西。这还不错。

ok
第8行是调用
odbc:sql\u query(Connection,sql)
返回与表达式
{selected,Columns,Results}匹配的结果时case语句的返回值。
。在这种情况下,它是无用的,因为函数
io:format(…)
已经返回
ok

第二个ok:
{ok,Conn}
是一种非常常见的Erlang用法:函数在成功的情况下返回元组
{ok,Value}
,在失败的情况下返回元组
{error,Reason}
。因此,您可以在成功案例中进行匹配,并使用这一行提取返回值:
{ok,Conn}=odbc:connect(ConnectionString,[]),

在这种情况下,函数
connect()
不会处理错误情况,因此此代码有4种不同的可能行为:

  • 它可能无法连接到数据库:进程将因第16行的错误匹配而崩溃
  • 它连接到数据库,但查询失败:主函数将返回值
    {error,Reason}
  • 它连接到数据库,查询返回一个与元组
    {selected,Columns,Results}
    不匹配的答案:该过程将在第4行出现badmatch错误而崩溃
  • 它连接到数据库,查询返回与元组
    {selected,Columns,Results}
    匹配的答案:函数将打印
成功!
列:列
结果:结果


然后返回
ok

谢谢你的解释,我现在感觉清楚多了。但正如您假设的那样:它连接到数据库,但查询失败:main函数将返回值{error,Reason}。当查询失败时,我什么也得不到(但我想得到一些错误,如
列colu_name not found