Jython没有捕获异常

时间:2014-03-10 16:10:02

标签: python exception-handling import jython

Jython没有-m选项,并且使用from .utils import *引发错误。

解决方案不是使用相对路径

sys.path.insert(0, os.path.dirname(__file__))
from utils import *

由于我需要使用Jython和CPython的代码,我想出了这个命令:

try:
    from .utils import *
except Exception: # Jython or Python with python context/context.py invocation
    sys.path.insert(0, os.path.dirname(__file__))
    from utils import *

但是,Jython似乎没有捕获异常,仍然会生成异常。

  File "context/context.py", line 9
SyntaxError: 'import *' not allowed with 'from .'

基于How to know that the interpreter is Jython or CPython in the code?,我尝试了

binary = sys.executable
if binary is None:
    sys.path.insert(0, os.path.dirname(__file__))
    from utils import *
else:
    from .utils import *

我仍然得到SyntaxError,为什么Jython解释器在它应该这样做的时候继续解析from .utils import *;我的意思是,这段代码可行。

binary = sys.executable
if binary is None:
    sys.path.insert(0, os.path.dirname(__file__))
    from utils import *
else:
    pass

这是我的Jython信息:

Jython 2.7b1 (default:ac42d59644e9, Feb 9 2013, 15:24:52) 
[Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.7.0_51
Type "help", "copyright", "credits" or "license" for more information.

2 个答案:

答案 0 :(得分:0)

不知何故,它不喜欢你的相对导入,我正在考虑两种可能的解决方案:

  • 尝试从项目的根目录中导入utils包。
  • utils包的路径添加到您的PYTHONPATH。

答案 1 :(得分:0)

issubclass(SyntaxError, Exception)说它应该被抓住,事实上,如果你手动举起它就会被抓住:

try:
   raise SyntaxError
except Exception:
   print('caught it')

打印caught it。虽然

try:
     from . import *
except Exception:
     print('nope')

导致:

 File "<stdin>", line 2
SyntaxError: 'import *' not allowed with 'from .'

如果您在上面添加了一些代码,那么您会看到它没有被执行,即后一个异常不是运行时。在CPython中也是如此:

import sys
sys.stderr.write("you won't see it\n")

try:
    1_ # cause SyntaxError at compile time
except:
    print("you won't see it either")

编译期间出现错误。

要解决此问题,您可以尝试使用绝对导入:

from __future__ import absolute_import
from context.utils import * # both Jython and CPython