当前位置: 代码迷 >> python >> Jython没有捕获异常
  详细解决方案

Jython没有捕获异常

热度:30   发布时间:2023-07-14 08:59:35.0

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 .'

基于 , 我试过了

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种可能的解决方案:

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

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