在我的代码而不是库代码中出现异常时停止

2024-03-11

我正在使用 Python 库开发一个应用程序urllib有时由于无法访问 URL,会出现异常情况。

然而,异常在标准库堆栈中被提升了近 6 个级别:

/home/user/Workspace/application/main.py in call(path)
     11                                  headers={'content-type': 'application/json'},
     12                                  data=b'')
---> 13     resp = urllib.request.urlopen(req)          ####### THIS IS MY CODE
     14     return json.loads(resp.read().decode('utf-8'))

/usr/lib/python3.4/urllib/request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)
    159     else:
    160         opener = _opener
--> 161     return opener.open(url, data, timeout)
    162 
    163 def install_opener(opener):

/usr/lib/python3.4/urllib/request.py in open(self, fullurl, data, timeout)
    461             req = meth(req)
    462 
--> 463         response = self._open(req, data)
    464 
    465         # post-process response

/usr/lib/python3.4/urllib/request.py in _open(self, req, data)
    479         protocol = req.type
    480         result = self._call_chain(self.handle_open, protocol, protocol +
--> 481                                   '_open', req)
    482         if result:
    483             return result

/usr/lib/python3.4/urllib/request.py in _call_chain(self, chain, kind, meth_name, *args)
    439         for handler in handlers:
    440             func = getattr(handler, meth_name)
--> 441             result = func(*args)
    442             if result is not None:
    443                 return result

/usr/lib/python3.4/urllib/request.py in http_open(self, req)
   1208 
   1209     def http_open(self, req):
-> 1210         return self.do_open(http.client.HTTPConnection, req)
   1211 
   1212     http_request = AbstractHTTPHandler.do_request_

/usr/lib/python3.4/urllib/request.py in do_open(self, http_class, req, **http_conn_args)
   1182                 h.request(req.get_method(), req.selector, req.data, headers)
   1183             except OSError as err: # timeout error
-> 1184                 raise URLError(err)
   1185             r = h.getresponse()
   1186         except:

URLError: <urlopen error [Errno 111] Connection refused>

我通常运行代码ipython3%pdb魔法开启,万一出现异常我可以立即检查。然而为此,我必须向下查看堆栈 6 层才能找到我的代码。

我的应用程序崩溃直接指向我的代码是否可以实现?


我会修改代码:

try:
    resp = urllib.request.urlopen(req)

except Exception as e:
    raise RuntimeError(e)

那样:

  • %pdb 将您转到您的代码,
  • 原始异常被保留为“次要”异常的参数。

你也可以使用猴子补丁urllib.request.urlopen()功能:

class MonkeyPatchUrllib(object):
    def __enter__(self):
        self.__urlopen = urllib.request.urlopen
        urllib.request.urlopen = self
    def __exit__(self, exception_type, exception_value, traceback):
        urllib.request.urlopen = self.__urlopen
    def __call__(self, *args, **kwargs):
        try:                                  
            return self.__urlopen(*args, **kwargs)
        except Exception as e:
            raise RuntimeError(e)

任何时候您提出异常urlibopen()在上下文管理器范围内调用:

with MonkeyPatchUrllib():
    #your code here

%pdb 只会使您距离代码仅 1 级。

[EDIT]

With sys.exc_info()可以保留原始异常的更详细上下文(如其回溯)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在我的代码而不是库代码中出现异常时停止 的相关文章

随机推荐