Font
[thread]11221[/thread]

Problem mit Block-Scoping

Reader: 1


<< >> 7 entries, 1 page
Corvin
 2008-01-31 18:37
#105412 #105412
User since
2008-01-25
4 articles
BenutzerIn
[default_avatar]
Hallo,

ich habe ein paar Fragen zu dem folgenden Konstrukt:

Code: (dl )
1
2
3
4
5
6
7
our $cycle = 'devel'; ## 'prod'; ## => production

if ( $cycle eq 'devel' ) {
use CGI::Carp qw(fatalsToBrowser); ## Output errors/warnings directly to browser only in 'development' stage!
use warnings;
use strict;
}


Warum funktioniert das nicht?
Es hat wahrscheinlich mit dem {}-Block Scoping zu tun.
Jedenfalls funtioniert es, wenn ich die IF-Bedingung entferne.

Ich möchte komfortabel über eine Variable Debugging ein- und ausschalten können.

Wie kann ich den gewünschten Effekt trotzdem erreichen?
Strat
 2008-01-31 18:54
#105413 #105413
User since
2003-08-04
5246 articles
ModeratorIn
[Homepage] [default_avatar]
use CGI::Carp wird zur Compilezeit ausgeführt, also schon sehr viel früher als die if-Blöcke. siehe auch -f use

versuch's entweder mit eval, oder besser verwende eine require/import-Kombination.

Die Pragmata use warnings und use strict hingegen sind nur auf den aktuellen Block beschränkt. D.h. es bleibt auf den if-Block beschränkt und hat nachher keine Auswirkungen.

use strict lasse ich auch in Produktion immer drinnen; ob ein aktives use warnings in Produktion Sinn macht, hängt davon ab.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
pq
 2008-01-31 21:33
#105418 #105418
User since
2003-08-04
12207 articles
Admin1
[Homepage]
user image
strict und warnings lasse ich immer drin. lieber entferne ich alle warnungen im code, bevor ich
eine verpasse.
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
Struppi
 2008-02-01 12:07
#105444 #105444
User since
2006-02-17
628 articles
BenutzerIn
[Homepage]
user image
dito. use strict und warnings (ich benutze -w) sind immer an.

Aber ich nutze zusätzlich eine selbstgeschriebene Debugroutine, die die und warn abfängt, die Meldungen sammelt und je nach dem mit welchen Debuglevel das Skript aufgerufen wird, diese ausgibt, verwirft oder an meine Mailadresse schickt.
Dadurch läßt sich vermeiden, dass irgendwelche Meldungen den User erschrecken (es sollte natürlich trotzdem eine sinnvolle Meldung ausgegeben werden).
renee
 2008-02-01 12:36
#105454 #105454
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
Struppi+2008-02-01 11:07:19--
dito. use strict und warnings (ich benutze -w) sind immer an.


Bei -w musst Du halt aufpassen, weil das "global" gilt. Und Du weißt ja nie, wie Module programmiert wurden...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Struppi
 2008-02-01 15:09
#105472 #105472
User since
2006-02-17
628 articles
BenutzerIn
[Homepage]
user image
Ja, ich weiß - genau deshalb nutze ich es auch.
Mittlerweile ist es selten geworden das ein Modul von CPAN hier schluddert, aber vor ein paar Jahren hat mich das durchaus nerven gekostet.
Corvin
 2008-02-22 13:04
#106235 #106235
User since
2008-01-25
4 articles
BenutzerIn
[default_avatar]
Hallo,

erstmal danke für die Antworten und sorry für meine späte Antwort.

Ich habe die Ratschläge umgesetzt und die knapp 12.000 Zeilen Perl-Code 'strict + warnings'-konform umgeschrieben.

Den Code-Entwickler würde ich am liebsten lynchen ... :-(

Jedenfalls läuft es jetzt sauber ohne Warnungen.

Wahrscheinlich kennt Ihr CGI::Carp::DebugScreen schon, für mich ist es sehr hilfreich um einfach zwischen Entwicklungs- und Produktionsumgebung umschalten zu können, so wie es ursprünglich geplant war.

Code: (dl )
1
2
3
4
5
6
7
use CGI::Carp::DebugScreen;   ## WAS: use CGI::Carp qw(fatalsToBrowser);

our $cycle = 'devel'; ## 'prod'; ## => production
our $debug= 0;

if ( $cycle eq 'devel' ) { $debug = 1; }
CGI::Carp::DebugScreen->debug( $debug );

und diese Include-Datei dann einfach per
Code: (dl )
require 'config/debug.inc';
eingebunden

Der Vorteil von CGI::Carp::DebugScreen ist, dass es einen Stacktrace im Entwicklungsmodus ausgibt, und in der Releaseversion nur eine einfache Rückmeldung für den Benutzer, dass ein Fehler aufgetreten ist (und der Admin darüber informiert wurde).

so ähnlich sieht es dann im Debug-Modus aus:

http://image.blog.livedoor.jp/nipotan/imgs/a/2/a2b67309.jpg
<< >> 7 entries, 1 page



View all threads created 2008-01-31 18:37.