2009-08-11 5 views
6

ओवरराइड नहीं कर सकता है के व्यवहार को अनुकूलित करने का प्रयास करें जैसा कि the recipe द्वारा वर्णित है।sys.excepthook

IPython में

:

:import pdb, sys, traceback 
:def info(type, value, tb): 
: traceback.print_exception(type, value, tb) 
: pdb.pm() 
:sys.excepthook = info 
:-- 
>>> x[10] = 5 
------------------------------------------------- 
Traceback (most recent call last): 
    File "<ipython console>", line 1, in <module> 
NameError: name 'x' is not defined 
>>> 

pdb.pm() बुलाया जा रहा है नहीं है। ऐसा लगता है कि sys.excepthook = info मेरी पायथन 2.5 स्थापना में काम नहीं करता है।

उत्तर

11

ipython, जिसे आप सामान्य पायथन इंटरैक्टिव शैल के बजाय उपयोग कर रहे हैं, सभी अपवादों को स्वयं जाल करता है और sys.excepthook का उपयोग नहीं करता है। इसे के बजाय ipython -pdb के रूप में चलाएं, और यह स्वचालित रूप से बिना किसी अपवाद के पीडीबी का आह्वान करेगा, जैसा कि आप अपने excepthook के साथ करने की कोशिश कर रहे हैं।

+0

और कैसे किसी IPython साथ हुक को छोड़कर उपयोग के बारे में जाना होगा? – levesque

+1

यह आंशिक रूप से भ्रामक है। ipython जाल अपवाद स्वयं करता है, लेकिन जिस तरह से यह sys.excepthook का उपयोग कर है, तो आप यह नहीं कह सकते कि यह sys.excepthook का उपयोग नहीं करता है। ipython उपयोगकर्ता से इस हुक को ओवरराइड करने की क्षमता को हटा देता है, हालांकि। – snapshoe

+0

@fugacity और Alex - मैं उस क्षेत्र में एक एम्बेडेड खोल कैसे लॉन्च कर सकता हूं जहां अपवाद होता है? मैंने अभी यहां एक प्रश्न खोला है: http://stackoverflow.com/questions/15752437/opening-an-ipython-shell-on-any-uncatched-exception और यह धागा पाया जो अत्यधिक प्रासंगिक प्रतीत होता है। शायद आप यह जान सकते हैं कि यह कैसे करें। –

0

this SO question देखें और सुनिश्चित करें कि आपके sitecustomize.py में कुछ ऐसा नहीं है जो इंटरैक्टिव मोड में डिबगिंग को रोकता है।

8

यह लिखने के पांच साल बाद, आईपीथन अभी भी इस तरह से काम करता है, इसलिए मुझे लगता है कि समाधान यह लोगों के लिए उपयोगी हो सकता है।

IPython sys.excepthook प्रतिस्थापित करता है जब भी आप कोड की एक पंक्ति निष्पादित करते हैं, इसलिए sys.excepthook के आपके ओवरराइडिंग का कोई प्रभाव नहीं पड़ता है। इसके अलावा, आईपीथन भी sys.excepthook पर कॉल नहीं करता है, यह सभी अपवादों को पकड़ता है और चीजों को दूर करने से पहले उन्हें स्वयं संभालता है।

आईपीथॉन चल रहा है, जबकि अपवाद हैंडलर को ओवरराइड करने के लिए, आप अपने खोल के showtraceback विधि पर बंदरगाह कर सकते हैं। उदाहरण के लिए, यहाँ कैसे मैं क्या एक साधारण पायथन ट्रैसबेक तरह लग रहा है (क्योंकि मुझे पसंद नहीं है कितने शाब्दिक IPython के हैं) देने के लिए ओवरराइड है:

def showtraceback(self): 
    traceback_lines = traceback.format_exception(*sys.exc_info()) 
    del traceback_lines[1] 
    message = ''.join(traceback_lines) 
    sys.stderr.write(message) 

import sys 
import traceback 
import IPython 
IPython.core.interactiveshell.InteractiveShell.showtraceback = showtraceback 

यह दोनों सामान्य टर्मिनल कंसोल और क्यूटी कंसोल में काम करता है।

0

क्रिस जवाब पर विस्तार हो रहा है, तो आप jupyters showbacktrace के लिए अपने खुद कार्यक्षमता जोड़ने के लिए एक डेकोरेटर की तरह एक और समारोह का उपयोग कर सकते हैं:

from IPython.core.interactiveshell import InteractiveShell 
from functools import wraps 
import traceback 
import sys 

def change_function(func): 
    @wraps(func) 
    def showtraceback(*args, **kwargs): 
     # extract exception type, value and traceback 
     etype, evalue, tb = sys.exc_info() 
     if issubclass(etype, Exception): 
      print('caught an exception') 
     else: 
      # otherwise run the original hook 
      value = func(*args, **kwargs) 
      return value 
    return showtraceback 

InteractiveShell.showtraceback = change_function(InteractiveShell.showtraceback) 

raise IOError 
संबंधित मुद्दे