Schrift
[thread]3374[/thread]

SYBperl und Errorhandling: Probleme mit dem Errorhandling des Modul



<< >> 10 Einträge, 1 Seite
Gast Gast
 2003-11-13 18:21
#35706 #35706
Hi,

Ich weiß nicht ob ich hier in diesem Forum mit der Frage richtig bin, aber ich hoffe ihr könnt mir helfen.

Ich greife mit Sybperl auf eine Sybase-Datenbank zu. Leider kommt es zum Sofortigen Script abbruch, wenn ich einen Fehler von SYBASE erhalte.

Ich habe, wie von Michael Pepper beschrieben eine eigene Fehlerbehandlungsroutine geschrieben, in der ich nichts von dem Scriptabbruch geschrieben habe.

WARUM BRICHT DIESES ***** SCRIPT DANN TROTZDEM AB?

Ich benutze Perl 5.6.1, Sybperl und bin auf einer HP-UX am coden.

vielen Dank für eure Aufmerksamkeit,

Tronde
JW
 2003-11-13 18:26
#35707 #35707
User since
2003-08-04
467 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Gibt es denn irgendeine Meldung, wenn das Skript abbricht?

edit: Will meinen, wird eine Fehlerausschrift vom Modul oder von Perl durchgereicht?\n\n

<!--EDIT|JW|1068740915-->
Tronde
 2003-11-13 18:34
#35708 #35708
User since
2003-11-13
10 Artikel
BenutzerIn
[default_avatar]
Ich verstehe noch nicht ganz was du meinst...

Also bei mir wird die meldung der DB durch die Routine von mir in eine Datei geschrieben.

Allerdings sollte das Script doch dannach einfach weiter laufen, oder nicht?
pq
 2003-11-13 18:35
#35709 #35709
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ich kann DBD::Sybase empfehlen, also wenn du SYBperl nicht unbedingt
benutzen musst, wechsle das modul...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Tronde
 2003-11-13 18:37
#35710 #35710
User since
2003-11-13
10 Artikel
BenutzerIn
[default_avatar]
KAnn ich mir denken... leider steht genau das nicht in meiner Gewalt das zu Entscheiden...

hat wer von euch ne Ahnung warum das Script aufhört?
Relais
 2003-11-13 18:39
#35711 #35711
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Um es noch mehr zu unterstreichen, Sybperl ist seit über 5 Jahren deprecated, will heißen vom eigenen Autor nicht mehr empfohlen. Weiter unterstützt wird statt dessen
CPAN:DBD::Sybase
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
Tronde
 2003-11-13 18:44
#35712 #35712
User since
2003-11-13
10 Artikel
BenutzerIn
[default_avatar]
Ja. Stimmt.
Allerdings ist das wie gesagt nicht in meiner Macht! - Leider

Bekomme diese meldung zurück:


DB-Library: General SQL Server error: Check messages from the SQL Server.

Ansonsten steht halt im Log das ich ohne Berechtigung auf ne Tablle zugegriffen habe... (aus test zwecken)

Hier mal das script

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#! perl 

use Sybase::Sybperl;
use Sybase::DBlib;

dbmsghandle ("message_handler");
dberrhandle ("error_handler");

my $user= "";
my $pass= "";
my $server= "";
my $db = "";
my $dbh = 0;
my @data;
my @rueck;
my $status = "";
my $sql = " Select * from Test ";


open(LOGG,">>x.test");
print LOGG "\n  LOGG".log_time()."opend";
$dbh = new Sybase::DBlib $user,$pass;
print LOGG "\n  LOGG".log_time()."Connected";
$dbh->dbuse($db);
print LOGG "\n  LOGG".log_time()."DB changed";
$status = $dbh->dbcmd($sql);
print LOGG "\n  LOGG".log_time()."sql";
$status = $dbh->dbsqlexec;
print LOGG "\n  LOGG".log_time()."executed";
$status=$dbh->dbresults;
print LOGG "\n  LOGG".log_time()."results";

while(@data = $dbh->dbnextrow)
{
  if(@rueck==0)
  {
@rueck=[@data];
  }
  else
  {
  push(@rueck,[@data]);
  }
}
$sql = "select * from tet";
$status = $dbh->dbcmd($sql);
print LOGG "\n  LOGG".log_time()."sql";
$status = $dbh->dbsqlexec;
print LOGG "\n  LOGG".log_time()."executed";
$status=$dbh->dbresults;
print LOGG "\n  LOGG".log_time()."results";


$dbh->dbclose;
print LOGG "\n  LOGG".log_time()."DB closed";

foreach  (@rueck)
{

print "\n ". $_;
}

close(LOGG);

#=============================================================
#=============================================================
# Sybperl Error-Handling
#=============================================================

sub message_handler
{
my ($db, $message, $state, $severity, $text, $server, $procedure,$line) = @_;

if ($severity > 10)
 {
  print LOGG "\n !FAIL".log_time()."Sybase message ". $message .", Severity ". $severity .", state ". $state;
  print LOGG "\n !FAIL".log_time()."Server `". $server. "'" if defined ($server);
  print LOGG "\n !FAIL".log_time()."Procedure `". $procedure. "'" if defined ($procedure);
  print LOGG "\n !FAIL".log_time()."Line ". $line if defined ($line);
  print LOGG "\n !FAIL".log_time().$text. "\n\n";

# &dbstrcpy returns the command buffer.

  if(defined($db))
  {
   my ($lineno, $cmdbuff) = (1, undef);
   my $row;

   $cmdbuff = &Sybase::DBlib::dbstrcpy($db);
     
   foreach $row (split (/\n/, $cmdbuff))
   {
    print LOGG "\n !FAIL".log_time(). sprintf ("%5d", $lineno ++). "> ". $row, "\n";
   }
  }
 }
 elsif ($message == 0)
 {
  print LOGG "\n !FAIL".log_time(). $text;
 }
   
 return 1;
}

sub error_handler
{
my ($db, $severity, $error, $os_error, $error_msg, $os_error_msg)= @_;
# Check the error code to see if we should report this.
if ($error != SYBESMSG)
{
print LOGG "\n !FAIL".log_time()."Sybase error: ", $error_msg;
 print LOGG "\n !FAIL".log_time()."OS Error: ", $os_error_msg if defined ($os_error_msg);      
}
   
return 0;
}
JW
 2003-11-13 19:41
#35713 #35713
User since
2003-08-04
467 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Mhh, da ich gleich zum Treffen muss, habe ich mich nicht wirklich vertieft, aber die Funktion error_handler gibt eine 0 zurück. Könnte es sein, dass die empfangende Funktion daraufhin das Skript beendet?
Wie gesagt, Sybperl kenne ich gar nicht und da scheint ja auch noch eine eigene C-Bibliothek dahinter zu stehen.
Tronde
 2003-11-14 15:09
#35714 #35714
User since
2003-11-13
10 Artikel
BenutzerIn
[default_avatar]
Scheinst mit deiner Vermutung recht zu haben, bei
Code: (dl )
return 1;


sagt er mir zumindestens schon mal
Attempt to INT_CONTINUE on a non-timeout error:
DB-Library: General SQL Server error: Check messages from the SQL Server.


Ich schau mal ob ich die C-Library finden kann..
Tronde
 2003-11-14 15:12
#35715 #35715
User since
2003-11-13
10 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
return 2;


das hilft !


ICH DANKE EUCH FÜR EURE HILFE !!!
Speziell dir JW.

Ciao,
Tronde
<< >> 10 Einträge, 1 Seite



View all threads created 2003-11-13 18:21.