我是这个 rdkit 的新手,下面是我用来从公式获取化学图像的代码,
from rdkit import Chem
m = Chem.MolFromSmiles('OCC1OC(C(C(C1O)O)O)[C]1(C)(CO)CC(=O)C=C(C1CCC(=O)C)C')
m
如果代码正确,它会显示结构。上面的代码显示错误说
"[15:23:55] Explicit valence for atom # 11 C, 5, is greater than permitted"
我尝试添加 try catch,但是没有帮助。
我需要捕获此异常/消息并将其显示给用户。
我们该如何做到这一点?| ||在此发布图片 Issue Image Here
try:
from rdkit import Chem
m = Chem.MolFromSmiles('OCC1OC(C(C(C1O)O)O)[C]1(C)(CO)CC(=O)C=C(C1CCC(=O)C)C')
m
except Exception as e:
print(e)
遇到的问题在于
Chem.MolFromSmiles
函数在 RDKit 中默认不会引发异常。它返回一个
None
值,并在遇到错误的 SMILES 字符串时将错误消息打印到控制台。
这就是的 try-except 块没有按预期工作的原因——实际上没有引发异常来捕获。
可以通过以下方法解决此问题:
-
检查返回值:
检查
Chem.MolFromSmiles
的返回值。如果返回None
,则表示存在错误。可以使用rdkit.Chem.rdBase.GetErrorMessage()
检索错误消息。
```python from rdkit import Chem
smiles_string = 'OCC1OC(C(C(C1O)O)O)[C]1(C)(CO)CC(=O)C=C(C1CCC(=O)C)C' m = Chem.MolFromSmiles(smiles_string)
if m is None: error_message = Chem.rdBase.GetErrorMessage() print(f"SMILES 字符串 '{smiles_string}' 无效:{error_message}") else: # 在这里继续处理分子 'm' m ```
-
启用显式异常:
从 RDKit 版本 2020.03.03 开始,可以启用一个选项,使
Chem.MolFromSmiles
在遇到错误的 SMILES 字符串时引发显式异常。这可以通过设置rdkit.Chem.SetOptions
中的sanitize
选项来实现。
```python from rdkit import Chem
Chem.rdBase.DisableLog() # 可选:抑制警告消息 Chem.SetOptions('sanitize=True') # 在遇到错误时启用异常
try: m = Chem.MolFromSmiles('OCC1OC(C(C(C1O)O)O)[C]1(C)(CO)CC(=O)C=C(C1CCC(=O)C)C') # 如果 SMILES 字符串有效,则在此处处理分子 'm' except Exception as e: print(f"发生错误:{e}") ```
这两种方法都可以帮助捕获并向用户显示错误消息。选择觉得在的代码中更易读、更易于维护的方法。
标签:python,rdkit From: 75683009