gvsig-scripting / org.gvsig.scripting / trunk / org.gvsig.scripting / org.gvsig.scripting.app / org.gvsig.scripting.app.mainplugin / src / main / resources-plugin / scripting / lib / cssutils / errorhandler.py @ 475
History | View | Annotate | Download (3.74 KB)
1 |
#!/usr/bin/env python
|
---|---|
2 |
"""cssutils ErrorHandler
|
3 |
|
4 |
ErrorHandler
|
5 |
used as log with usual levels (debug, info, warn, error)
|
6 |
|
7 |
if instanciated with ``raiseExceptions=True`` raises exeptions instead
|
8 |
of logging
|
9 |
|
10 |
log
|
11 |
defaults to instance of ErrorHandler for any kind of log message from
|
12 |
lexerm, parser etc.
|
13 |
|
14 |
- raiseExceptions = [False, True]
|
15 |
- setloglevel(loglevel)
|
16 |
"""
|
17 |
__all__ = ['ErrorHandler']
|
18 |
__docformat__ = 'restructuredtext'
|
19 |
__version__ = '$Id$'
|
20 |
|
21 |
import logging |
22 |
import urllib2 |
23 |
import xml.dom |
24 |
|
25 |
class _ErrorHandler(object): |
26 |
"""
|
27 |
handles all errors and log messages
|
28 |
"""
|
29 |
def __init__(self, log, defaultloglevel=logging.INFO, |
30 |
raiseExceptions=True):
|
31 |
"""
|
32 |
inits log if none given
|
33 |
|
34 |
log
|
35 |
for parse messages, default logs to sys.stderr
|
36 |
defaultloglevel
|
37 |
if none give this is logging.DEBUG
|
38 |
raiseExceptions
|
39 |
- True: Errors will be raised e.g. during building
|
40 |
- False: Errors will be written to the log, this is the
|
41 |
default behaviour when parsing
|
42 |
"""
|
43 |
# may be disabled during setting of known valid items
|
44 |
self.enabled = True |
45 |
|
46 |
if log:
|
47 |
self._log = log
|
48 |
else:
|
49 |
import sys |
50 |
self._log = logging.getLogger('CSSUTILS') |
51 |
hdlr = logging.StreamHandler(sys.stderr) |
52 |
formatter = logging.Formatter('%(levelname)s\t%(message)s')
|
53 |
hdlr.setFormatter(formatter) |
54 |
self._log.addHandler(hdlr)
|
55 |
self._log.setLevel(defaultloglevel)
|
56 |
|
57 |
self.raiseExceptions = raiseExceptions
|
58 |
|
59 |
def __getattr__(self, name): |
60 |
"use self._log items"
|
61 |
calls = ('debug', 'info', 'warn', 'error', 'critical', 'fatal') |
62 |
other = ('setLevel', 'getEffectiveLevel', 'addHandler', 'removeHandler') |
63 |
|
64 |
if name in calls: |
65 |
self._logcall = getattr(self._log, name) |
66 |
return self.__handle |
67 |
elif name in other: |
68 |
return getattr(self._log, name) |
69 |
else:
|
70 |
raise AttributeError( |
71 |
'(errorhandler) No Attribute %r found' % name)
|
72 |
|
73 |
def __handle(self, msg=u'', token=None, error=xml.dom.SyntaxErr, |
74 |
neverraise=False, args=None): |
75 |
"""
|
76 |
handles all calls
|
77 |
logs or raises exception
|
78 |
"""
|
79 |
if self.enabled: |
80 |
if error is None: |
81 |
error = xml.dom.SyntaxErr |
82 |
|
83 |
line, col = None, None |
84 |
if token:
|
85 |
if isinstance(token, tuple): |
86 |
value, line, col = token[1], token[2], token[3] |
87 |
else:
|
88 |
value, line, col = token.value, token.line, token.col |
89 |
msg = u'%s [%s:%s: %s]' % (
|
90 |
msg, line, col, value) |
91 |
|
92 |
if error and self.raiseExceptions and not neverraise: |
93 |
if isinstance(error, urllib2.HTTPError) or isinstance(error, urllib2.URLError): |
94 |
raise
|
95 |
elif issubclass(error, xml.dom.DOMException): |
96 |
error.line = line |
97 |
error.col = col |
98 |
raise error(msg)
|
99 |
else:
|
100 |
self._logcall(msg)
|
101 |
|
102 |
def setLog(self, log): |
103 |
"""set log of errorhandler's log"""
|
104 |
self._log = log
|
105 |
|
106 |
|
107 |
class ErrorHandler(_ErrorHandler): |
108 |
"Singleton, see _ErrorHandler"
|
109 |
instance = None
|
110 |
|
111 |
def __init__(self, |
112 |
log=None, defaultloglevel=logging.INFO, raiseExceptions=True): |
113 |
|
114 |
if ErrorHandler.instance is None: |
115 |
ErrorHandler.instance = _ErrorHandler(log=log, |
116 |
defaultloglevel=defaultloglevel, |
117 |
raiseExceptions=raiseExceptions) |
118 |
self.__dict__ = ErrorHandler.instance.__dict__
|