babalae/better-genshin-impact · error · ArgumentOutOfRangeException

不支持的 Paddle OCR 模型配置

Error message

不支持的 Paddle OCR 模型配置

What it means

CreatePaddleOcrInstance switches on _config.PaddleOcrModelConfig; the default arm throws ArgumentOutOfRangeException if the value is not one of the known model configs (V4Auto, V5Auto, V5, V6, V4, V4En, V5Korean, V5Latin, V5Eslav). This protects against a config value that has no corresponding model assets.

Source

Thrown at BetterGenshinImpact/Core/Recognition/OCR/OcrFactory.cs:121

            PaddleOcrModelConfig.V6 =>
                new PaddleOcrService(App.ServiceProvider.GetRequiredService<BgiOnnxFactory>(),
                    PaddleOcrService.PaddleOcrModelType.V6),
            PaddleOcrModelConfig.V4 =>
                new PaddleOcrService(App.ServiceProvider.GetRequiredService<BgiOnnxFactory>(),
                    PaddleOcrService.PaddleOcrModelType.V4),
            PaddleOcrModelConfig.V4En =>
                new PaddleOcrService(App.ServiceProvider.GetRequiredService<BgiOnnxFactory>(),
                    PaddleOcrService.PaddleOcrModelType.V4En),
            PaddleOcrModelConfig.V5Korean =>
                new PaddleOcrService(App.ServiceProvider.GetRequiredService<BgiOnnxFactory>(),
                    PaddleOcrService.PaddleOcrModelType.V5Korean),
            PaddleOcrModelConfig.V5Latin =>
                new PaddleOcrService(App.ServiceProvider.GetRequiredService<BgiOnnxFactory>(),
                    PaddleOcrService.PaddleOcrModelType.V5Latin),
            PaddleOcrModelConfig.V5Eslav =>
                new PaddleOcrService(App.ServiceProvider.GetRequiredService<BgiOnnxFactory>(),
                    PaddleOcrService.PaddleOcrModelType.V5Eslav),
            _ => throw new ArgumentOutOfRangeException(nameof(_config.PaddleOcrModelConfig),
                _config.PaddleOcrModelConfig, "不支持的 Paddle OCR 模型配置")
        };
    }

    public Task Unload()
    {
        if (_paddleOcrService is not IDisposable disposable)
        {
            _paddleOcrService = null;
            return Task.CompletedTask;
        }
        try
        {
            disposable.Dispose();
            _paddleOcrService = null;
        }
        catch (Exception ex)
        {

View on GitHub (pinned to a7cb36712d)

Solutions

  1. Set PaddleOcrModelConfig to a supported value (e.g. V5Auto).
  2. Validate the enum at config load and fall back to a known model.
  3. Keep the switch exhaustive when adding new model configs.

Example fix

// before
// config.PaddleOcrModelConfig = someUnknownValue
var svc = factory.PaddleOcr;

// after
if (!Enum.IsDefined(_config.PaddleOcrModelConfig))
    _config.PaddleOcrModelConfig = PaddleOcrModelConfig.V5Auto;
var svc = factory.PaddleOcr;
Defensive patterns

Strategy: validation

Validate before calling

if (!Enum.IsDefined(_config.PaddleOcrModelConfig) ||
    !_knownModels.Contains(_config.PaddleOcrModelConfig))
    _config.PaddleOcrModelConfig = PaddleOcrModelConfig.V5Auto;
var svc = factory.PaddleOcr;

Type guard

static readonly HashSet<PaddleOcrModelConfig> _knownModels = new()
{
    PaddleOcrModelConfig.V4Auto, PaddleOcrModelConfig.V5Auto, PaddleOcrModelConfig.V5,
    PaddleOcrModelConfig.V6, PaddleOcrModelConfig.V4, PaddleOcrModelConfig.V4En,
    PaddleOcrModelConfig.V5Korean, PaddleOcrModelConfig.V5Latin, PaddleOcrModelConfig.V5Eslav
};

Prevention

When it happens

Trigger: A PaddleOcrModelConfig enum value added without a case; default(PaddleOcrModelConfig) when 0 isn't a valid member; a settings file with a stale/renamed model identifier.

Common situations: Config schema migration that introduced a new enum member not yet handled; hand-edited config with a typo; deserialized settings from an older version.

Related errors


AI-assisted analysis of babalae/better-genshin-impact@a7cb36712d (2026-08-13). Data as JSON: /api/errors/dfe547e330cb761e. Report an issue: GitHub.