Jython does not catch Exceptions

ε祈祈猫儿з 提交于 2019-12-13 05:38:25

问题


Jython doesn't have the -m option, and it raises an error with from .utils import *.

The solution is not to use relative path

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

As I need to use the code both Jython and CPython, I came up with this command:

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 *

However, Jython doesn't seem to catch the exception, and still generates an exception.

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

Based on How to know that the interpreter is Jython or CPython in the code?, I tried

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

I still get the SyntaxError, why Jython interpreter keeps parsing from .utils import * when it was supposed to do so; I mean, this code works.

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

This is my Jython information:

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.

回答1:


Somehow it doesn't like your relative import, I am thinking about 2 possibles solutions:

  • Try to import the utils package from the root of your project.
  • Add the path to utils package to your PYTHONPATH.



回答2:


issubclass(SyntaxError, Exception) says that it should be caught and indeed, if you raise it manually it is being caught:

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

It prints caught it. Though

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

leads to:

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

If you add some code above then you see that it is not executed i.e., the latter exception is not runtime. It is the same in CPython e.g.:

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")

The error is raised during compilation.

To workaround the problem, you could try to use absolute imports:

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


来源:https://stackoverflow.com/questions/22305365/jython-does-not-catch-exceptions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!