Правильная обработка std.getopt.GetOptException - PullRequest
0 голосов
/ 19 сентября 2018

Как правильно обрабатывать исключение std.getopt.GetOptException, которое выдается при отсутствии необходимого аргумента командной строки.

При объявлении необходимого аргумента выдается следующая ошибка: way слишком многословно:

std.getopt.GetOptException@/Library/D/dmd/src/phobos/std/getopt.d(755): Required option file|f was not supplied
----------------
/Library/D/dmd/src/phobos/std/format.d-mixin-1127:1138 @safe std.getopt.GetoptResult std.getopt.getopt!(std.getopt.config, immutable(char)[], immutable(char)[], immutable(char)[]*, std.getopt.config, immutable(char)[], immutable(char)[], immutable(char)[]*, immutable(char)[], immutable(char)[], bool*, immutable(char)[], immutable(char)[], bool*).getopt(ref immutable(char)[][], std.getopt.config, immutable(char)[], immutable(char)[], immutable(char)[]*, std.getopt.config, immutable(char)[], immutable(char)[], immutable(char)[]*, immutable(char)[], immutable(char)[], bool*, immutable(char)[], immutable(char)[], bool*) [0xbb5a9d1]
source/app.d:11 _Dmain [0xbb58996]
std.getopt.GetOptException@/Library/D/dmd/src/phobos/std/getopt.d(755): Required option key|k was not supplied

Используйте следующий код для его воспроизведения:

import std.stdio;
import std.getopt;

int main(string[] args)
{
    string key;
    string inputFile;
    bool encrypt;
    bool decrypt;

    auto result = getopt(
        args,
        std.getopt.config.required,
        "key|k", "The key to use", &key,
        std.getopt.config.required,
        "file|f", "The file to encrypt/decrypt", &inputFile,
        "encrypt|e", "Encrypt the file", &encrypt,
        "decrypt|d", "Decrypt the file", &decrypt
    );

    if (result.helpWanted) {
        defaultGetoptPrinter("Some information about the program.", result.options);
    }

    return 0;
}

1 Ответ

0 голосов
/ 19 сентября 2018

Разумный способ сделать это - обернуть вызов getopt в блок try-catch, перехватить любую ошибку и написать только часть сообщения об ошибке перед выходом.Это позволит избежать записи трассировки стека, что бесполезно для большинства пользователей.Изменение приведенного выше примера:

import std.stdio;
import std.getopt;

int main(string[] args)
{
    string key;
    string inputFile;
    bool encrypt;
    bool decrypt;

    try {
        auto result = getopt(
            args,
            std.getopt.config.required,
            "key|k", "The key to use", &key,
            std.getopt.config.required,
            "file|f", "The file to encrypt/decrypt", &inputFile,
            "encrypt|e", "Encrypt the file", &encrypt,
            "decrypt|d", "Decrypt the file", &decrypt
        );

        if (result.helpWanted) {
            defaultGetoptPrinter("Some information about the program.", result.options);
        }
    }
    catch (Exception e) {
        stderr.writefln("Error processing command line arguments: %s", e.msg);
        return 1;
    }

    return 0;
}

Сообщение об ошибке при запуске:

Error processing command line arguments: Required option file|f was not supplied

На форуме изучения языка D есть тема, которая может быть полезна: Как правильно использовать std.getopt? .Я написал несколько инструментов командной строки с открытым исходным кодом, которые являются более обширными примерами, например. TSV-sample.d .

...