4.错误处理 | 4. Error handling
4错误处理
4.1战略
在概念层面上,使用Erlang ODBC API启动数据库连接是一种基本的客户端服务器应用程序。客户端进程使用API来启动并与管理连接的服务器进程通信。Erlang ODBC应用程序的策略是应用程序本身的编程错误会导致连接进程异常终止(当进程异常终止时,其监控程序将记录相关的错误报告)。在连接终止期间或之后调用API函数过程中,将返回{error, connection_closed}
。另一方面,上下文错误不会终止连接,它只会返回{error, Reason}
到客户端,Reason
可能是任何erlang术语。
客户
连接与创建它的进程相关联,并且只能通过它进行访问。其原因是在调用select_count / 2,3或关闭auto_commit时保留结果集和事务的语义。尝试使用来自其他进程的连接将失败。这不会影响连接。另一方面,如果客户进程死亡,连接将被终止。
超时
客户端对连接的所有请求都是同步的。如果超时被使用并且过期,则客户端进程将退出,并有理由超时。可以正确的做法是让客户死亡,并可能由其主管重新启动。但是如果客户选择赶上这个超时时间,最好等一会再试一次。如果连续超时被捕获的连接过程将会断定存在严重错误并终止连接。
高音
所有的API函数都被警告,如果你传递了错误类型的参数,将会发生运行时错误。内部功能的所有输入参数都值得信赖。仅从不真正的外部来源输入信息是一种很好的编程实践。你不应该捕获这些错误,它只会使代码变得非常混乱并且更加复杂,这会引入更多的错误,并且在最坏的情况下也会掩盖实际的错误。把你的努力放在测试上,你应该相信你自己的意见。
4.2全貌
由于Erlang ODBC应用程序依赖于第三方产品并与可能在网络中另一台计算机上运行的数据库进行通信,因此可能会出现很多错误。为了充分理解可能发生的事情,有助于了解Erlang ODBC应用程序的设计,因此在此简要介绍当前的设计。
注
请注意,设计是一些东西,不一定会,但在未来的版本中可能会改变。虽然API的语义不会改变,因为它与实现无关。
图4.1:ErlangODBC应用程序的体系结构
当您执行应用程序时:启动(odbc)唯一发生的情况是启动了一个主管进程。对于每次调用API函数connect / 2,都会生成一个进程并将其作为子进程添加到Erlang ODBC超级用户。主管人员的唯一任务是提供错误日志报告,如果子进程应该异常死亡,并且可以进行代码更改。只有客户进程才能决定是否应该重新启动此连接管理进程。
erlang连接过程由connect / 2产生,将打开一个端口到一个c进程,该进程通过Microsoft的ODBC API处理与数据库的通信。erlang端口将保持打开状态,以便退出信号传播,如果c进程中出现问题并退出,我们希望知道尽可能多的原因。与c进程的主要通信是通过套接字完成的。C进程由两个线程组成,主管线程和数据库处理线程。管理程序线程检查管理程序套接字上的关闭消息,数据库处理程序线程接收请求并在数据库套接字上发送答案。如果数据库线程似乎挂在某个数据库调用上,则erlang控制进程将在超级用户套接字上发送关闭消息,在这种情况下,c进程将退出。
错误类型
可能发生的错误类型可分为以下几类。
- 配置问题 - 从数据库设置不正确的角度来看,应该通过erlang端口运行的c程序没有为您的平台编译。
- 由ODBC驱动程序发现的错误 - 如果由于Erlang ODBC应用程序员无法控制的情况导致对ODBC驱动程序的调用失败,则会从驱动程序中挖出错误字符串。该字符串将
Reason
在{error, Reason}
返回值中。这个错误信息当然会取决于驱动程序。这种情况的例子是试图插入相同的密钥两次,无效的SQL查询和数据库脱机。
- 连接终止 - 如果连接以异常方式终止,或者如果尝试通过调用disconnect / 1来以正常方式使用已经终止的连接,返回值将为
{error, connection_closed}
。由于Erlang ODBC应用程序中的编程错误,连接可能会异常终止,但是如果ODBC驱动程序崩溃也会导致连接异常终止。
- 上下文错误 - 如果在错误的上下文中使用API函数,
Reason
错误元组中的元素将是一个描述性原子。例如,如果您尝试在last/[1,2]
不首先调用select_count/[2,3]
将结果集与连接关联的情况下调用该函数。如果ODBC驱动程序不支持某些功能,或者如果您禁用连接的某些功能,然后尝试使用它。