加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

oracle – 无法捕获PL / SQL异常处理程序中的transfer_timeout错

发布时间:2021-01-17 13:24:40 所属栏目:站长百科 来源:网络整理
导读:我将超时设置为2秒,但代码运行了一分钟,然后转到其他时间而不是UTL_HTTP.transer_timeout. DECLARE request UTL_HTTP.REQ; response UTL_HTTP.RESP; n NUMBER; buff VARCHAR2 (4000); clob_buff CLOB;BEGIN UTL_HTTP.SET_RESPONSE_ERROR_CHECK (FALSE); UTL_

我将超时设置为2秒,但代码运行了一分钟,然后转到其他时间而不是UTL_HTTP.transer_timeout.

DECLARE
   request     UTL_HTTP.REQ;
   response    UTL_HTTP.RESP;
   n           NUMBER;
   buff        VARCHAR2 (4000);
   clob_buff   CLOB;
BEGIN
   UTL_HTTP.SET_RESPONSE_ERROR_CHECK (FALSE);
   UTL_HTTP.set_transfer_timeout (2);
   request := UTL_HTTP.BEGIN_REQUEST ('www.google.com:81','GET');
   UTL_HTTP.SET_HEADER (request,'User-Agent','Mozilla/4.0');
   response := UTL_HTTP.GET_RESPONSE (request);
   DBMS_OUTPUT.PUT_LINE (
      'HTTP response status code: ' || response.status_code);  
EXCEPTION
   WHEN UTL_HTTP.transfer_timeout
   THEN
      DBMS_OUTPUT.put_line ('Timeout');
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.put_line ('Exception in others  :' || SQLERRM);
END;

为什么没有抓住超时?

解决方法

您正在获得连接超时而不是传输超时.它是从BEGIN_REQUEST而不是GET_RESPONSE引出的;它没有转移任何东西,它只是试图打开到远程主机和端口的连接.如果你有一个连接和GET或POST,其请求/响应超过2秒,那么你会看到UTL_HTTP.transfer_timeout.但是你看到的是传输层问题,而不是HTTP请求问题.

您可以捕获’HTTP failure’部分,但不是特定的TNS超时,因为它由UTL_HTTP处理:

DECLARE
   ...
   http_failure exception;
   pragma exception_init(http_failure,-29273);
BEGIN
   ...
EXCEPTION
   WHEN UTL_HTTP.transfer_timeout
   THEN
      DBMS_OUTPUT.put_line ('Transfer timeout');
   WHEN http_failure
   THEN
      DBMS_OUTPUT.put_line ('HTTP failure - timeout?');
      RAISE;
END;

当您看到并查出更具体的错误时,您可以深入了解异常堆栈,但不清楚您想要对具体原因做什么.大概你真的不想抓住这一切,你只是调试异常,为什么你设置的超时不起作用…

我不知道有什么方法可以改变超时的长度.因为它来自TNS,它看起来应该受到sqlnet.outbound_connect_timeout的影响,但你在sqlnet.ora中设置了它,并且服务器在这种情况下似乎没有注意到它.它可能使用操作系统默认值.

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读