class X::Redeclaration does X::Comp { }

Thrown when a symbol (variable, routine, type, parameter, ...) is redeclared. Note that redeclarations are generally fine in an inner scope, but if the redeclaration appears in the same scope as the original declaration, it usually indicates an error and is treated as one.

Examples

my $xmy $x;

dies with

===SORRY!===
Redeclaration of symbol $x

It works with routines too:

sub f() { }
sub f() { }

dies with

===SORRY!===
Redeclaration of routine f

But those are fine

my $x;
sub f() {
    my $x;          # not a redeclaration, 
                    # because it's in an inner scope 
    sub f() { };    # same 
}

Methods §

method symbol §

Returns the name of the symbol that was redeclared.

method what §

Returns the kind of symbol that was redeclared. Usually symbol, but can also be routine, type etc.

method postfix §

Returns a string that is attached to the end of the error message. It usually explains the particular problem in more detail, or suggests way to fix the problem.

Type Graph §

Type relations for X::Redeclaration
perl6-type-graph X::Redeclaration X::Redeclaration Exception Exception X::Redeclaration->Exception X::Comp X::Comp X::Redeclaration->X::Comp Mu Mu Any Any Any->Mu Exception->Any X::Comp->Exception

Expand above chart

Routines supplied by role X::Comp §

X::Redeclaration does role X::Comp, which provides the following routines:

(X::Comp) method filename §

The filename in which the compilation error occurred

(X::Comp) method line §

The line number in which the compilation error occurred.

(X::Comp) method column §

The column number of location where the compilation error occurred. (Rakudo does not implement that yet).

Routines supplied by class Exception §

X::Redeclaration inherits from class Exception, which provides the following routines:

(Exception) method message §

Defined as:

method message(Exception:D: --> Str:D)

This is a stub that must be overwritten by subclasses, and should return the exception message.

Special care should be taken that this method does not produce an exception itself.

try die "Something bad happened";
if ($!{
    say $!.message# OUTPUT: «Something bad happened.␤» 
}

(Exception) method backtrace §

Defined as:

method backtrace(Exception:D:)

Returns the backtrace associated with the exception in a Backtrace object or an empty string if there is none. Only makes sense on exceptions that have been thrown at least once.

try die "Something bad happened";
with $! { .backtrace.print ; }

(Exception) method throw §

Defined as:

method throw(Exception:D:)

Throws the exception.

my $exception = X::AdHoc.new;    # Totally fine 
try $exception.throw;            # Throws 
if ($!{ #`( some handling ) }# Suppress the exception

(Exception) method resume §

Defined as:

method resume(Exception:D:)

Resumes control flow where .throw left it when handled in a CATCH block.

# For example, resume control flow for any exception 
CATCH { default { .resume } }

(Exception) method rethrow §

Defined as:

method rethrow(Exception:D:)

Rethrows an exception that has already been thrown at least once. This is different from throw in that it preserves the original backtrace.

sub f() { die 'Bad' };
sub g() { fCATCH { default { .rethrow } } };
g;
CATCH { default { say .backtrace.full } };

(Exception) routine fail §

Defined as:

multi sub    fail(Exception $e)
method       fail(Exception:D:)

Exits the calling Routine and returns a Failure object wrapping the exception.

# A custom exception defined 
class ForbiddenWord is Exception {
    has Str $.word;
    method message { "This word is forbidden: «$!word»" }
}
 
sub say-word ( $word ) {
    ForbiddenWord.new(:word($word)).fail if $word eq 'foo';
    $word.say;
}
 
my $result = say-word("foo");
say $result.exception;

The routine form works in the same way, with an alternative syntax: fail ForbiddenWord.new(:word($word)).

(Exception) method gist §

Defined as:

multi method gist(Exception:D:)

Returns whatever the exception printer should produce for this exception. The default implementation returns message and backtrace separated by a newline.

my $e = X::AdHoc.new(payload => "This exception is pretty bad");
try $e.throw;
if ($!{ say $!.gist};
# OUTPUT: «This exception is pretty bad 
#   in block <unit> at <unknown file> line 1␤»

(Exception) routine die §

Defined as:

multi sub die()
multi sub die(*@message)
multi sub die(Exception:D $e)
method    die(Exception:D:)

Throws a fatal Exception. The default exception handler prints each element of the list to $*ERR (STDERR).

die "Important reason";

If the subroutine form is called without arguments, the value of $! variable is checked. If it is set to a .DEFINITE value, its value will be used as the Exception to throw if it's of type Exception, otherwise, it will be used as payload of X::AdHoc exception. If $! is not .DEFINITE, X::AdHoc with string "Died" as payload will be thrown.

die will print by default the line number where it happens

die "Dead";
# OUTPUT: «(exit code 1) Dead␤ 
# in block <unit> at /tmp/dead.p6 line 1␤␤» 

However, that default behavior is governed at the Exception level and thus can be changed to anything we want by capturing the exception using CATCH. This can be used, for instance, to suppress line numbers.

CATCH {
  default {
    .payload.say
  }
};
die "Dead" # OUTPUT: «Dead␤» 

(Exception) sub warn §

Defined as:

multi sub warn(*@message)

Throws a resumable warning exception, which is considered a control exception, and hence is invisible to most normal exception handlers. The outermost control handler will print the warning to $*ERR. After printing the warning, the exception is resumed where it was thrown. To override this behavior, catch the exception in a CONTROL block. A quietly {...} block is the opposite of a try {...} block in that it will suppress any warnings but pass fatal exceptions through.

To simply print to $*ERR, please use note instead. warn should be reserved for use in threatening situations when you don't quite want to throw an exception.

warn "Warning message";
Generated from

Generated from Type/X/Redeclaration.pod6