【问题标题】:Error handling with invalid MAC entry with Perl Net::MAC module使用 Perl Net::MAC 模块处理无效 MAC 条目的错误
【发布时间】:2019-03-14 15:36:04
【问题描述】:

我正在尝试编写一个要求用户输入 MAC 地址的 Perl 脚本。我正在使用 Net::MAC 模块将用户输入的任何格式的 MAC 地址转换为标准格式,供我稍后在脚本中使用。我已经完成了大部分工作,但我似乎无法弄清楚如何处理他们输入无效 MAC 的情况。不可能是 MAC 地址的东西。例如包含非 A-F 字母的条目。

我在想像下面这样的东西应该可以工作,但是当它死掉时,它会完全杀死整个脚本,而不是重新要求用户再次输入 MAC。

    use Net::MAC;

    my $proceed = "no";
    while ($proceed eq "no"){
        print "Enter the MAC address: ";
        my $mac;
        $mac = <>;
        chomp($mac);
        my $tempMac = Net::MAC->new('mac' => $mac, 'die' => 0);
        if ($tempMac->die() eq "0"){
            print "Looks like you entered an invalid MAC address.  Please try again.\n";
        } else {
            my $newMac = $tempMac->convert('base' => 16,'bit_group' => 8,'delimeter' => ":");
            $proceed = "yes";
        }
    }

应该改用 Try, Catch 语句之类的东西吗?我认为换句话说,我需要知道如何适当地处理 die() 事件而不让脚本完全保释我。

【问题讨论】:

  • 根据其文档,Net::Mac 对象没有die 方法......地址无效究竟会发生什么?任何错误消息等?
  • 如果我输入虚假内容,我会得到类似以下内容; 39568jkl:“发现 MAC 地址元数据失败,MAC 地址中的无效字符“00:00:39:56:8j:kl”在 ./RTTest.pl 第 124 行”我希望能够对此进行测试并循环返回并要求用户重新输入 MAC 地址。
  • 我需要坐下来实际玩代码,但是这个模块中的错误处理真的很奇怪。当 die 为 0 时,它只是存储一条错误消息并继续尝试做它的事情,从而导致更多错误。如果 die 为 0 且 verbose 为 1,它将使用 carp 打印错误,但如果 die 为 0,它不应该发出嘶嘶声。
  • 看起来您应该使用$tempMac-&gt;get_error() 并查看它是否返回undef 以检查是否有错误。我想知道tempMac-&gt;die() 是否正在调用内置的die...

标签: perl error-handling scripting


【解决方案1】:

请参阅https://mvp.kablamo.org/essentials/die-eval 了解有关异常在 Perl 中如何工作以及如何处理它们的信息。考虑使用 Syntax::Keyword::Try 以获得熟悉的 try/catch 范例。

use Syntax::Keyword::Try;
my $newMac;
try {
    my $tempMac = Net::MAC->new('mac' => $mac);
    $newMac = $tempMac->convert('base' => 16,'bit_group' => 8,'delimeter' => ":");
    $proceed = "yes";
} catch {
    print "Looks like you entered an invalid MAC address. Error: $@ Please try again.\n";
}

您还可以在将 MAC 地址传递给 Net::MAC 之前使用 Regexp::Common 之类的方式验证 MAC 地址。

use Regexp::Common 'net';
my $newMac;
if ($mac =~ m/$RE{net}{MAC}/) {
    my $tempMac = Net::MAC->new('mac' => $mac);
    $newMac = $tempMac->convert('base' => 16,'bit_group' => 8,'delimeter' => ":");
    $proceed = "yes";
} else {
    print "Looks like you entered an invalid MAC address. Please try again.\n";
}

【讨论】:

    猜你喜欢
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多