1

以下代码(试图“打开”一个提供错误密码的加密 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 库针对相同类型的错误(即提供的错误密码)引发(随机?)不同的异常。在大多数情况下,它会加注,但有时会加注。捕捉已经够糟糕了(但在这里我们至少可以检查),但如果也捕捉到,甚至无法区分 (a) 密码错误或 (b) RAR 文件错误的错误。BadRarFileRuntimeErrorRuntimeErrorargsexcept unrar.rarfile.BadRarFile

4

1 回答 1

1

您可以链接多个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")

除了使用不同的错误消息“密码错误或有缺陷的文件”和“密码错误或其他”之外,不幸的是,我看不到任何改进的可能性。

简而言之:UnRAR 库针对相同类型的错误(即提供的错误密码)引发(随机?)不同的异常。在大多数情况下,它会加注,但有时会加注。BadRarFileRuntimeError

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

如果“原始”unrar命令没有此问题,则可能是 Python 包装库中的上游错误。

于 2019-12-21T14:25:20.970 回答