2017-01-02 1 views
2

Ich versuche, den Runtime-Mssql-Fehler in Variable zu speichern und mit allen anderen Daten fortzufahren.Wie wird der Runtime-Mssql-Fehler in einer Variablen gespeichert und weiterhin in Perl ausgeführt?

Ich habe den Eval-Block verwendet, aber es funktioniert auch nicht.

Mein Verfahren wie folgt (Probe)

CREATE procedure testprocedure as 
select 'one' 
select 'three' 
select 10/0 
select 'five' 

Als ich das Skript ausführen zeigt es

Der Ausgang

ist
Row: one 
DBD::ODBC::st finish failed: [unixODBC][FreeTDS][SQL Server]Divide by zero error encountered. (SQL-22012) at testing.pl line 24. 
DBI::db=HASH(0xbe79a0)->disconnect invalidates 1 active statement handle (either destroy statement handles or call finish on them before disconnecting) at testing.pl line 28. 

Nicht Ausgang Anzeige auch three. Zeigt den einzigen an.

+0

Wenn Sie dies in Verfahren selbst tun möchten, können Sie die Ausnahmebehandlung mit try..catch Blöcke tun. Siehe Dokumentation hier https: // msdn.microsoft.com/de-de/library/ms175976.aspx' –

+0

Möchten Sie mit dem Skript fortfahren, indem Sie nur die Fehler erfassen? – AbhiNickz

+0

@AbhiNickz Ja, ich möchte das Skript fortsetzen. – mkHun

Antwort

2

Das Print Griff Attribut weist DBI die Perl zu nennen warnen() Funktion (die typischerweise in Fehlern resultiert zum siebgedruckt wird, wenn anzutreffen) und das Raiseerror Griff Attribut (die DBI teilt das Perl zu nennen Die Funktion "Die() bei Fehler", typischerweise , die den sofortigen Abbruch des Skripts verursacht). - Programming the Perl DBI

Daher könnten Sie unten verwenden, um die Situation zu behandeln.

local $SIG{__DIE__} = sub { 
    my ($die_message) = @_; 
    #do something.. 
}; 

Ich versuche, die Fehler in der Variablen

In kleinen Skript zu speichern $die_message wird die Fehlermeldung enthalten.


wäre eine weitere Option RaiseError-0 und PrintError auf 1 zu setzen, sein, so dass Sie die warn Ings bekommen, aber Programm macht die nicht.

Print

Das Print Attribut kann verwendet werden, Fehler zu zwingen Warnungen (unter Verwendung warnen) zusätzlich zu generieren Fehlercodes im normalen Weise zurückkehrt. Wenn "on" gesetzt ist, führt jede Methode, die zu einem Fehler führt, dazu, dass der DBI effektiv eine warn("$class $method failed: $DBI::errstr") ausführt, wobei $class die Treiberklasse und $method der Name der Methode ist, die fehlgeschlagen ist.

Raiseerror

Das Attribut Raiseerror können Fehler verwendet werden, um zu zwingen Ausnahmen eher zu erhöhen als nur Fehlercodes in der normalen Art und Weise zurück. Es ist ist standardmäßig "aus". Wenn "on" gesetzt ist, führt jede Methode, die zu einem Fehler führt, dazu, dass der DBI effektiv eine die("$class $method failed: $DBI::errstr") ausführt, wobei $class die Treiberklasse und $method der Name der fehlgeschlagenen Methode ist.

Quelle - DBI docs


Sie können es auch tun manuell durch

my $dbh=DBI->connect(....{RaiseError=>1}) or die... 
my $sth=$dbh->prepare(...); 
{ 
    local $dbh->{RaiseError} = 0; 
    $sth->execute; 
    if ($sth->Errstr) { 
     # handle the error 
    } 
} 
# $dbh->{RaiseError} is back to normal here 
+0

Warum nicht einfach von 'RaiseError' auf' PrintError' wechseln? – dgw

+0

@Chankeypathak Wie verhindert man den dbi 'abort'? – mkHun

+0

@mkHun Da dgw das Ausschalten von RaiseError erwähnt hat und das Aktivieren von PrintError den Abbruch verhindert. –

0

bekam ich die Antwort für meine Frage von this Antwort.

Die letzte Antwort ist

do 
{ 
while(my @row=$sth->fetchrow_array()) 
{ 
    if ($sth->errstr) 
    { 
     my $Error = $sth->errstr; 

    } 
    print $row[0]."\n\n"; 
} 
} while ($sth->{odbc_more_results}); 
Verwandte Themen