
Έχω αυτό το λογισμικό Perl που υποτίθεται ότι θα τρέξει 24/7. Διατηρεί ανοίξετε μια σύνδεση σε ένα διακομιστή IMAP, ελέγχει για νέα μηνύματα και στη συνέχεια ταξινομεί τα νέα μηνύματα.


Τώρα έχω ένα χρήστη που είναι σε χειμερία νάρκη XP laptop του κάθε φορά σε μια στιγμή. Όταν συμβαίνει αυτό, η σύνδεση με το διακομιστή αποτυγχάνει και μια εξαίρεση ενεργοποιείται. Ο κωδικός κλήσης πιάνει συνήθως ότι η εξαίρεση και προσπαθεί να επανασυνδεθεί. Αλλά σε αυτή την περίπτωση, φαίνεται ότι τα Windows (ή Perl;) είναι να πιάσει την εξαίρεση και την παράδοση στον χρήστη μέσω ενός κιβωτίου μήνυμα.


Καθένας ξέρει πώς να αποτρέψει αυτό το είδος της wtf? Θα μπορούσε κωδικό μου αλιευμάτων ένα «σύστημα-είναι-για-να-χειμερία νάρκη» σήμα;


Για να ξεκαθαρίσω μερικά σημεία που ήδη έθεσε:


* Δεν έχω κανένα πρόβλημα με τους χρήστες χειμερία νάρκη μηχανές τους. Απλά πρέπει να βρούμε έναν τρόπο για να ασχοληθεί με αυτό.
* Η μονάδα Perl εν λόγω κάνει μια εξαίρεση. Κάνει κάτι σαν «πεθαίνουν“γραμμή foo”. Παρά το γεγονός ότι η αίτηση είναι εντελώς browser που βασίζεται και δεν χρησιμοποιεί τίποτα όπως Wx ή Tk, ο χρήστης λαμβάνει ένα πλαίσιο μηνύματος με τίτλο“poll\_timer”. Το περιεχόμενο της εν λόγω πλαίσιο μηνύματος είναι ακριβώς τα περιεχόμενα από $ @ ( 'γραμμή foo' σε αυτό το παράδειγμα).
* Η εφαρμογή έχει μεταγλωττιστεί σε ένα εκτελέσιμο χρησιμοποιώντας [perlapp](http://docs.activestate.com/pdk/7.3/PerlApp.html) . Η τεκμηρίωση δεν αναφέρει τίποτα για το χειρισμό εξαίρεση, όμως.

 
Πώς μπορώ να αποτρέψω τα Windows από την αλίευση Perl εξαιρέσεις μου;
=====================================================================



Νομίζω ότι έχουμε να κάνουμε με μια εξαίρεση OS-επίπεδο, δεν είναι κάτι που ρίχνονται από Perl. Η σχετική ενότητα Perl κάνει μια κλήση σε κάτι σε ένα αρχείο DLL (υποθέτω), και η εξαίρεση γίνεται όλο και ρίχνονται. Ο καλύτερος τρόπος θα ήταν να βράσει αυτό κάτω σε μια απλή, αναπαραγόμενο δοκιμή που ενεργοποιεί την εξαίρεση (ίσως χρειαστεί να κάνετε πολλά χειμερία νάρκη και να ξυπνήσει τα μηχανήματα που εμπλέκονται για αυτή τη διαδικασία). Στη συνέχεια, στέλνουν τις πληροφορίες στον κύριο του έργου της μονάδας και να τους ρωτήσετε αν μπορεί να έρθει με ένα μέσο για τη σύλληψη αυτή την εξαίρεση κατά τρόπο που να είναι πιο χρήσιμο για σας.


Αν ο κύριος του έργου της μονάδας δεν μπορεί ή δεν θα βοηθήσει, τότε μάλλον θα περατωθεί χρειάζεται να χρησιμοποιήσετε το πρόγραμμα εντοπισμού σφαλμάτων Perl για τον εντοπισμό σφαλμάτων στον κώδικα του module και να δούμε τι ακριβώς συμβαίνει, και να δούμε αν υπάρχει ένας τρόπος που μπορείτε να αλλάξετε η μονάδα εαυτό σας να πιάσει και να ασχοληθεί με την εξαίρεση.

 

Έχω βρει ένα hack για να αποφύγετε τα παράθυρα διαλόγου συστήματος μεταφορικών μέσων για τη σκληρή λάθη (π.χ. «αντιμετώπισε και εξαίρεση και πρέπει να τερματιστεί»). Δεν ξέρω αν το ίδιο κόλπο θα δουλέψει για αυτό το είδος του λάθους που περιγράφετε, αλλά θα μπορούσε να δώσει μια δοκιμή.


Δείτε: [Αποφυγή το «αντιμετώπισε πρόβλημα και πρέπει να τερματιστεί» διαλόγου για τα Windows](http://autopragmatic.com/2008/03/25/avoiding-the-encountered-a-problem-and-needs-to-close-dialog-on-windows/)


Με λίγα λόγια, που το HKEY\_LOCAL\_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Windows \ ErrorMode κλειδί μητρώου με την τιμή «2".

 

Είναι δύσκολο να προσφέρει έξυπνες προτάσεις χωρίς να δει τις σχετικές κομμάτια του κώδικα. Εάν παίρνετε ένα παράθυρο διαλόγου με ένα μήνυμα εξαίρεση το πρόγραμμα είναι πολύ πιθανό χρησιμοποιώντας είτε το [Tk](http://www.perltk.org) ή [wxPerl](http://wxperl.sourceforge.net/) βιβλιοθήκη GUI, η οποία μπορεί να περιπλέξει τα πράγματα λίγο. Με αυτόν εν λόγω, η εικασία μου θα ήταν ότι θα ήταν αρκετά εύκολο να τροποποιήσετε το χειρισμό εξαίρεση στο πρόγραμμα τυλίγοντας το σημείο αποτυχίας σε ένα μπλοκ eval και τη δοκιμή $ @ μετά την κλήση. Αν $ @ περιέχει ένα μήνυμα σφάλματος που υποδεικνύει αποτυχία σύνδεσης, στη συνέχεια, την αποκατάσταση της σύνδεσης και να πάει στο δρόμο σας.

 

χρήστη σας δεν είναι η εξαίρεση αλλά ο κανόνας. laptop μου είναι νάρκη μεταξύ εργασίας και σπιτιού. Στη δουλειά, είναι για το δίκτυο DHCP? στο σπίτι, είναι σε μια άλλη εντελώς. Τα περισσότερα προγράμματα να συνεχίσουν να εργάζονται παρά τη σύγχυση πλήθος των διευθύνσεων IP (VMWare, VPN, απλό παλιό σύνδεση μέσω NAT router). Εκείνοι που δεν κάνουν (AT & T Net πελάτη, για το VPN - αχρησιμοποίητο στο γραφείο, απαραίτητο στο σπίτι ή στο δρόμο) αναγνωρίζουν την αποσύνδεση κατά το χρόνο αδρανοποίησης (AT & T Net-πελάτη κρατά ψηλά τη διαδικασία αναμονής / αδρανοποίησης μέχρι να αποσυνδεθεί), και την αποκατάσταση της σύνδεσης ανάλογα με την περίπτωση, όταν η μηχανή ξυπνά. Στα αεροδρόμια, μπορώ να χρησιμοποιήσω το τοπικό WiFi (πάνω DHCP), αλλά με τη σειρά του ασύρματου συνολικά (ένα φυσικό διακόπτη) πριν από την επιβίβαση στο αεροπλάνο.


Έτσι, θα πρέπει να μάθετε πώς να μάθουν ότι το μηχάνημα είναι να υπεισέλθω σε κατάσταση αναμονής ή αδρανοποίησης για το λογισμικό σας να μπορούν να χρησιμοποιηθούν. Αυτό που δεν έχω, λυπάμαι να πω, είναι μια συνταγή για το τι πρέπει να κάνετε.


Κάποια εργασία με την Google δείχνει ότι ACPI (Advanced Configuration and Interface ρεύματος) είναι μέρος της λύσης ( [Microsoft](http://support.microsoft.com/kb/907477) ). APM (Προηγμένης Διαχείρισης Ενέργειας) μπορεί επίσης να είναι σχετική.

 