Jython:测试以防止异常“无法创建具有非字节值的PyString”?

时间:2015-05-30 10:38:16

标签: exception jython

Jython 2.7.0(最终版)。操作系统:W7(64位)

此代码:

keys = javax.swing.UIManager.getDefaults().keys()
while keys.hasMoreElements():
    key = keys.nextElement()
    logger.info( "=== key %s" % str( key ) )
    try:  
        value = javax.swing.UIManager.get(key)
    except java.lang.Throwable, t:
        logger.error( "=== thrown %s" % str( t ) )

生成各种键......直到输出

  

=== key PasswordField.echoChar

然后抛出

  

java.lang.IllegalArgumentException:无法创建PyString   非字节值

我知道这是Jython中的一个已知错误...只是想知道在引发异常之前是否有一种测试方法?

2 个答案:

答案 0 :(得分:1)

对我来说,直接在包含Unicode字符的任何值的Java HashMap上使用print()时会触发此操作。一个简单的Python版isBytes from PyString class是检测它的一种方法,但坦率地说,除非你(a)知道触发问题的数据元素和/,否则我认为这不是一个好选择。或(b)打算掩盖或修正触发该问题的价值。可能最好的解决方案就是捕获异常。

这肯定会影响Jython> = 2.7并且在进行故障排除时是一个非常烦人的错误。对我来说,我只是在PyString类代码中注释掉IllegalArgumentException并重新编译。现在,Jython将很乐意直接打印出HashMaps,并将{Unicode}字符替换为?,就像在以前的版本中一样。我猜这会导致问题,可能是代码处理大量的Unicode或其他东西,但我还没有发现任何问题。

捕获例外:

from java.lang import IllegalArgumentException

keys = javax.swing.UIManager.getDefaults().keys()
while keys.hasMoreElements():
    key = keys.nextElement()
    logger.info( "=== key %s" % str( key ) )
    try:
        value = javax.swing.UIManager.get(key)
    except java.lang.Throwable, t:
        try:
            logger.error( "=== thrown %s" % str( t ) )
        except IllegalArgumentException:
            # fix it or w/e

isBytes的Python版本:

def test_if_char(value):
    for e in value:
        if ord(e) > 255: return False
    return True

答案 1 :(得分:1)

如果您使用Jython 2.7.0,可以使用以下代码在您的代码中使用任何Unicode字符串:

PyString str = Py.newStringOrUnicode("颜军")