(Я собирался оставить это как комментарий к ответу @ jldupont, но мне не хватает репутации.)
Я видел ответы, подобные ответу @ jldupont, и в других местах. FWIW, я думаю, важно отметить, что это:
except Exception as e:
print(e)
напечатает вывод ошибки в sys.stdout
по умолчанию. Более подходящим подходом к обработке ошибок в целом было бы:
except Exception as e:
print(e, file=sys.stderr)
(Обратите внимание, что для этого нужно import sys
.) Таким образом, ошибка выводится в STDERR
вместо STDOUT
, что позволяет правильно анализировать / перенаправлять вывод и т. Д. Я понимаю, что вопрос был строго о «печати ошибки», но, кажется, важно указать здесь лучшую практику, а не пропустить эту деталь, которая может привести к нестандартному коду для тех, кто в конечном итоге не научится лучше.
Я не использовал модуль traceback
, как в ответе Cat Plus Plus, и, возможно, это лучший способ, но я подумал, что я добавлю это туда.
Да, используйте неявные преобразования:
import java.lang.{Iterable => JavaItb}
import java.util.{Iterator => JavaItr}
implicit def jitb2sitb[T](jit: JavaItb[T]): Iterable[T] = new SJIterable(jit);
implicit def jitr2sitr[A](jit: JavaItr[A]): Iterator[A] = new SJIterator(jit)
Что затем можно легко реализовать:
class SJIterable[T](private val jitb: JavaItr[T]) extends Iterable[T] {
def elements(): Iterator[T] = jitb.iterator()
}
class SJIterator[T](private val jit: JavaItr[T]) extends Iterator[T] {
def hasNext: Boolean = jit hasNext
def next: T = jit next
}