Dies ist meine erste Frage, also entschuldige ich mich im Voraus, wenn ich alles falsch formatiere/frage.Verwenden Sie Try und Catch, um vergangene Fehler zu verschieben
Ich verwende Perl, um eine Zeichenfolge aus einer Datei zu extrahieren, ein Webformular zu senden und eine neue Datei herunterzuladen, die von der Webseite erstellt wurde. Das Ziel ist es, es für 30.000 Dateien in einer Schleife laufen zu lassen, was schätzungsweise ~ 8 Tage dauert. Ich verwende WWW :: Selenium und WWW :: Mechanize, um die Webautomatisierung durchzuführen. Das Problem, das ich habe, ist, dass, wenn aus irgendeinem Grund eine Seite nicht richtig lädt oder das Internet für eine gewisse Zeit abfällt, das Skript beendet wird und eine Fehlermeldung gibt (je nachdem, in welcher Stufe es fehlgeschlagen ist):
Error requesting http://localhost:4444/selenium-server/driver/:
ERROR: Could not find element attribute: link=Download PDB [email protected]
Ich möchte, dass das Skript weiterläuft und in die nächste Runde der Schleife geht, damit ich mir keine Sorgen machen muss, wenn eine einzelne Runde der Schleife einen Fehler verursacht. Meine Forschung schlägt vor, dass die Verwendung Try::Tiny
die beste Lösung sein kann. Derzeit habe ich das Skript unten nur mit try{...}
, die scheint, jeden Fehler zu unterdrücken und das Skript durch die Dateien fortzusetzen. Ich bin jedoch besorgt, dass dies eine sehr unverblümte Lösung zu sein scheint und mir keinen Einblick gibt, in welche/warum Dateien fehlgeschlagen sind.
Idealerweise würde ich den Dateinamen und die Fehlermeldung für jedes Vorkommen zu einer anderen Datei drucken, die dann überprüft werden kann, sobald das Skript abgeschlossen ist, aber ich habe Schwierigkeiten zu verstehen, wie man catch{...}
dies tut oder wenn das ist richtige Lösung.
use strict;
use warnings;
use WWW::Selenium;
use WWW::Mechanize;
use Try::Tiny;
my @fastas = <*.fasta>;
foreach my $file (@fastas) {
try{
open(my $fh, "<", $file);
my $sequence;
my $id = substr($file, 0, -6);
while (my $line = <$fh>) {
## discard fasta header line
} elsif($line =~ /^>/) { #/(turn off wrong coloring)
next;
## keep line, add to sequence string
} else {
$sequence .= $line;
}
}
close ($fh);
my $sel = WWW::Selenium->new(host => "localhost",
port => 4444,
browser => "*firefox",
browser_url => "http://www.myurl.com",
);
$sel->start;
$sel->open("http://www.myurl.com");
$sel->type("chain1", $sequence);
$sel->type("chain2", "EVQLVESGPGLVQPGKSLRLSCVASGFTFSGYGMHWVRQAPGKGLEWIALIIYDESNKYYADSVKGRFTISRDNSKNTLYLQMSSLRAEDTAVFYCAKVKFYDPTAPNDYWGQGTLVTVSS");
$sel->click("css=input.btn.btn-success");
$sel->wait_for_page_to_load("30000");
## Wait through the holding page - will timeout after 5 mins
$sel->wait_for_element_present("link=Download PDB File", "300000");
## Get the filename part of link
$sel->wait_for_page_to_load("30000");
my $pdbName = $sel->get_attribute("link=Download PDB File\@href");
## Concatenate it with the main domain
my $link = "http://www.myurl.com/" . $pdbName;
$sel->stop;
my $mech = WWW::Mechanize->new(autocheck => 1);
$mech -> get($link);
#print $mech -> content();
$mech -> save_content($id . ".pdb");
};
}
Ihr Code sieht fehlerhaft aus, zum Beispiel die Zeile} elsif ($ line = ~/^> \ /) {. Überprüfen Sie bitte Ihren geposteten Code. – wolfrevokcats
Ja, mir ist dieser Backslash bekannt. Ohne es ging die Formatierung auf dieser Seite drunter und drüber, ich konnte nicht herausfinden warum, aber es ist nicht in meinem eigentlichen Code. – PerlPingu
Ich sympathisiere damit! Ich habe Ihren Beitrag bearbeitet, um den Fehler zu korrigieren und weitere falsche Farben durch den Editor zu unterdrücken. Sie können dies tun, indem Sie einen weiteren Schrägstrich in einem Kommentar in derselben Zeile, '# /', hinzufügen. Ich fügte auch eine Aussage (in diesem Kommentar) hinzu, wofür es ist. Wenn Ihnen das nicht gefällt, bitte ändern Sie es auf alle Fälle. (Aber Sie wollen nicht Code, der falsch ist, egal, das Format.) – zdim