oracle – 无法捕获PL / SQL异常处理程序中的transfer_timeout错
发布时间:2021-01-18 00:01:52 所属栏目:站长百科 来源:网络整理
导读:我将超时设置为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中设置了它,并且服务器在这种情况下似乎没有注意到它.它可能使用操作系统默认值. (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |