Как обрабатывать переопределенные ошибки подпрограммы в Perl

Когда вы вызываете конструктор, инициализаторы переменной экземпляра запускаются перед телом конструктора. Что вы думаете о выходе программы ниже?

public class Tester {
    private Tester internalInstance = new Tester();
    public Tester() throws Exception {
        throw new Exception("Boom");
    }
    public static void main(String[] args) {
        try {
            Tester b = new Tester();
            System.out.println("Eye-Opener!");
        } catch (Exception ex) {
            System.out.println("Exception catched");
        }
    }
}

Основной метод вызывает конструктор Tester, который выдает исключение. Вы могли бы ожидать, что предложение catch поймает это исключение и выведет Исключение, пойманное . Но если вы попытались запустить его, вы обнаружили, что он ничего не делает, и он выбрасывает StackOverflowError.

13
задан floogads 29 August 2010 в 02:56
поделиться

3 ответа

сделайте следующее:

use POSIX ();

что остановит экспорт всех стандартных функций модуля POSIX. Затем вам нужно будет добавить префикс POSIX:: ко всем методам POSIX, например:

POSIX::remove(filename)

для функции удаления POSIX.

20
ответ дан 1 December 2019 в 17:24
поделиться

Другой способ подавить это предупреждение – поместить переопределение подпрограммы в блок без предупреждений 'переопределить':

{
    no warnings 'redefine';
    sub remove { ... }
}
22
ответ дан 1 December 2019 в 17:24
поделиться

Вы можете исключить определенные символы из обычного экспорта с помощью директивы '!name' (см. perldoc Exporter), например:

#!/usr/bin/perl -w
package Foo;

use strict;
use POSIX '!remove';

...

sub remove {
  ...
}
...
18
ответ дан 1 December 2019 в 17:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: