Error handling 了解Erlang ODBC应用程序
我正在使用Erlang ODBC连接到一个DB源。我的代码如下所示: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
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}
- 它连接到数据库,查询返回一个与元组
不匹配的答案:该过程将在第4行出现badmatch错误而崩溃{selected,Columns,Results}
- 它连接到数据库,查询返回与元组
匹配的答案:函数将打印{selected,Columns,Results}
成功!
列:列
结果:结果
然后返回
ok
谢谢你的解释,我现在感觉清楚多了。但正如您假设的那样:它连接到数据库,但查询失败:main函数将返回值{error,Reason}。当查询失败时,我什么也得不到(但我想得到一些错误,如列colu_name not found