Как передать ошибку в pymol/python?

Я пытаюсь найти расстояния между остатками белка в pymol, используя скрипт python, который вызывает команду pymol cmd.get_distance. Однако иногда есть несколько назначений атомов, что вызывает ошибку:

GetDistance-Error: Selection 2 doesn't contain a single atom/vertex.

Я хочу пропустить сайты, на которых есть эта проблема, поэтому я пытаюсь использовать try/pass:

try:
    cmd.get_distance(atom2)
except GetDistance-Error:
    pass

Однако он говорит мне, что такого сообщения об ошибке нет:

NameError: global name 'GetDistance' is not defined.

Как мне сказать, чтобы он прошел эту ошибку? разве GetDistance-Error не ошибка?


person Devinity    schedule 14.12.2014    source источник
comment
Скорее всего, вам понадобится захватить что-то вроде pymol.some_class.GetDistance-Error. Чтобы получить точную информацию, просто выполните import pymol в оболочке ipython, а затем используйте dir(pymol), чтобы получить список связанных объектов.   -  person Anshul Goyal    schedule 14.12.2014
comment
Другой способ — зафиксировать общее исключение, т. е. выполнить except Exception: pass, что не рекомендуется.   -  person Anshul Goyal    schedule 14.12.2014
comment
Я не думаю, что это может быть исключением из-за дефиса: GetDistance-Error не является допустимым идентификатором исключения. Документы помогают?   -  person xnx    schedule 14.12.2014
comment
Попробуйте обработать except pymol.CmdException: вместо except GetDistance-Error:   -  person Reut Sharabani    schedule 14.12.2014


Ответы (1)


Я наткнулся на ту же проблему. Я хочу поймать ошибку от pymols cmd.get_distance. В моем случае одно (или оба) выделения вообще не содержат атома (вместо 2).

Этот ответ не прояснит ошибку обработки в сценариях pymol, но решит саму проблему.

Таким образом, вместо того, чтобы ловить ошибку, вы можете проверить, есть ли в вашем выборе ровно 1 атом.

Ошибочный код:

PyMOL>dist = cmd.get_distance("///A/44/CA","///A/60/CA")
GetDistance-Error: Selection 1 doesn't contain a single atom/vertex.

Оптимизированный код:

PyMOL>p1 = cmd.select("p1","///A/44/CA")
PyMOL>p2 = cmd.select("p2","///A/60/CA")
PyMOL>dist = "N/A"
PyMOL>if p1 == 1 and p2 == 1: dist = cmd.get_distance("p1","p2")

Таким образом, вместо того, чтобы отлавливать ошибку, вы проверяете требования (один атом на выбор) для команды get_distance. Если вы запускаете непрерывный код, необходимо dist = N/A, иначе вы ложно получите последнее назначение расстояния.

person Ctueting    schedule 03.11.2020