如何记录 Python 的 UnRAR 库的错误密码?

How note a wrong password with Python's UnRAR library?

以下代码(尝试“打开”提供错误密码的加密 RAR 文件):

from unrar import rarfile
import unrar 

try:
    rarfile.RarFile("encrypted.rar", pwd="wrong_password")
except Exception as e:
    print(type(e))
    print(e)

大多数情况下,尽管 RAR 文件没有其他问题(可以使用正确的密码无误地解密),但输出:

<class 'unrar.rarfile.BadRarFile'>
Invalid RAR file.

但有时会输出:

<class 'RuntimeError'>
Bad password for Archive

如何使用 Python 的 UnRAR 库检查 RAR 文件的密码是否正确而不 链接异常?

简而言之:UnRAR 库引发(随机?)不同 异常相同类型的错误(即提供的密码错误) .在大多数情况下,它会引发 BadRarFile,但有时会引发 RuntimeError。捕获 RuntimeError 已经够糟糕了(但在这里我们至少可以检查 args),但如果还捕获 except unrar.rarfile.BadRarFile,甚至无法区分错误(a)密码是错误或 (b) RAR 文件错误。

您可以链接多个 except 以缩小错误范围。不幸的是,如果提供了错误的密码,您的 unrar 库似乎会引发非特定异常 RuntimeError。因此,您不能 100% 确定密码错误是否是错误的原因。

try:
    unrar.rarfile.RarFile("encrypted.rar", pwd="wrong_password")
except unrar.rarfile.BadRarFile:
    print("Specified file doesn't seem to be a proper RAR archive")
except RuntimeError:
    print("RuntimeError, possibly a wrong password")
except:
    print("Something else happened")

除了使用不同的错误消息 "Wrong password or defective file" 和 "Wrong password or something else",不幸的是,我看不到任何改进的可能性。

In short: UnRAR library raises (randomly?) different exception for the same type of error (namely, wrong password supplied). In most of the cases it raises BadRarFile but sometimes it raises RuntimeError.

根据 RAR 文件规范的版本,可能会更改处理错误密码的方式。也许使用较新版本的 RAR 文件无法区分损坏的文件和错误的密码,而这对于较旧的文件是可能的。 (或者反过来。)

如果 "original" unrar 命令没有这个问题,它可能是你的 Python 包装器库上游的错误。