Unhandled Handler Εξαίρεση σε .NET 1.1

ψήφοι
23

Είμαι διατηρώντας μια εφαρμογή .NET 1.1 και ένα από τα πράγματα που έχω επιφορτιστεί με κάνει ότι ο χρήστης δεν βλέπει κανένα εχθρικό ειδοποιήσεις σφάλματος.

Έχω προσθέσει χειριστές να Application.ThreadExceptionκαι AppDomain.CurrentDomain.UnhandledExceptionπου παίρνουν ονομάζεται. Το πρόβλημά μου είναι ότι το πρότυπο διαλόγου σφάλματος CLR εξακολουθεί να εμφανίζεται (πριν καλείται ο χειριστής εξαίρεση).

Jeff μιλά για το πρόβλημα αυτό στο blog του εδώ και εδώ . Αλλά δεν υπάρχει λύση. Έτσι, αυτό που είναι ο συνήθης τρόπος με .NET 1.1 για να χειριστεί ασύλληπτος εξαιρέσεις και να εμφανίσει μια φιλική προς το πλαίσιο διαλόγου;

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

Δημοσιεύθηκε 04/08/2008 στις 02:15
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
11

Ω, σε φόρμες των Windows σίγουρα θα πρέπει να είναι σε θέση να το πάρει για να λειτουργήσει. Το μόνο πράγμα που πρέπει να προσέξετε είναι τα πράγματα που συμβαίνουν σε διαφορετικά θέματα.

Έχω ένα παλιό άρθρο Κωδικός Έργου εδώ που θα πρέπει να βοηθήσει:

Φιλικό προς το χρήστη χειρισμό εξαίρεση

Απαντήθηκε 04/08/2008 στις 05:31
πηγή χρήστη

ψήφοι
5

Unhandled συμπεριφορά εξαίρεση σε .NET 1.x Windows Forms εφαρμογή εξαρτάται από:

  • Ο τύπος του νήματος που έριξε την εξαίρεση
  • Είτε αυτό συνέβη κατά την επεξεργασία του μηνύματος παράθυρο
  • Το κατά πόσον ένα πρόγραμμα εντοπισμού σφαλμάτων συνδέθηκε με τη διαδικασία
  • Η ρύθμιση μητρώου DbgJitDebugLaunchSetting
  • Η σημαία jitDebugging στην App.Config
  • Είτε υπερτερούσαν σε σχέση με το Windows Forms χειρισμού εξαιρέσεων
  • Είτε ο χειρισμός εκδήλωση, εκτός της CLR της
  • Η φάση της σελήνης

Η προεπιλεγμένη συμπεριφορά του unhandled εξαιρέσεις είναι:

  • Εάν η εξαίρεση εμφανίζεται στο κύριο νήμα κατά την άντληση μηνύματα παράθυρο, αυτό είναι υποκλαπούν από τον χειριστή Έντυπα εξαίρεση των Windows.
  • Εάν η εξαίρεση εμφανίζεται στο κύριο νήμα κατά την άντληση μηνύματα παράθυρο, θα τερματίσει τη διαδικασία εφαρμογής, εκτός αν έχει υποκλαπεί από το χειριστή Έντυπα εξαίρεση των Windows.
  • Εάν η εξαίρεση συμβαίνει σε ένα εγχειρίδιο, threadpool, ή το νήμα finalizer, είναι καταπίνεται από το CLR.

Τα σημεία επαφής για μια εξαίρεση που δεν αντιμετωπίστηκε είναι:

  • Windows Forms χειρισμού εξαιρέσεων.
  • Ο διακόπτης μητρώο ΚΟΕ-debug DbgJitDebugLaunchSetting.
  • Η CLR εκδήλωση εξαίρεση που δεν αντιμετωπίστηκε.

Η φόρμα των Windows ενσωματωμένο χειρισμό εξαίρεση κάνει την ακόλουθη από προεπιλογή:

  • Πιάνει μια εξαίρεση που δεν αντιμετωπίστηκε όταν:
    • εξαίρεση είναι σχετικά κύριο νήμα και καμία εντοπισμού σφαλμάτων συνημμένο.
    • εξαίρεση συμβαίνει κατά την επεξεργασία παράθυρο μηνύματος.
    • jitDebugging = false στο App.Config.
  • Εμφανίζει πλαίσιο διαλόγου με το χρήστη και αποτρέπει τον τερματισμό της εφαρμογής.

Μπορείτε να απενεργοποιήσετε το τελευταίο συμπεριφορά θέτοντας jitDebugging = true στο App.Config. Αλλά να θυμάστε ότι αυτό μπορεί να είναι η τελευταία σας ευκαιρία για να σταματήσει τον τερματισμό της εφαρμογής. Έτσι, το επόμενο βήμα για να πιάσει μια εξαίρεση που δεν αντιμετωπίστηκε η εγγραφή για Application.ThreadException περίπτωση, π.χ.

Application.ThreadException += new
Threading.ThreadExceptionHandler(CatchFormsExceptions);

Σημειώστε τη ρύθμιση DbgJitDebugLaunchSetting κάτω HKEY_LOCAL_MACHINE \ Software.NetFramework μητρώου. Αυτό έχει μία από τις τρεις τιμές των οποίων είμαι ενήμερος:

  • 0: δείχνει διαλόγου χρήστης ζητά «debug ή να τερματίσει».
  • 1: σας δίνει τη δυνατότητα εξαίρεσης μέσω των CLR για να ασχοληθούν μαζί τους.
  • 2: ξεκινά πρόγραμμα εντοπισμού σφαλμάτων ορίζονται στο κλειδί μητρώου DbgManagedDebugger.

Στο Visual Studio, πηγαίνετε στο μενού ΕργαλείαΕπιλογέςεντοπισμού σφαλμάτωνΚΟΕ να ορίσετε αυτό το κλειδί στο 0 ή 2. Όμως, μια τιμή 1 είναι συνήθως καλύτερο στον υπολογιστή του τελικού χρήστη. Σημειώστε ότι αυτό το κλειδί μητρώου ενεργήσει πριν από την εκδήλωση εξαίρεση που δεν αντιμετωπίστηκε CLR.

Αυτή η τελευταία περίπτωση είναι η τελευταία σας ευκαιρία για να συνδεθείτε μια εξαίρεση που δεν αντιμετωπίστηκε. Είναι ενεργοποιείται πριν έχουν εκτελέσει Τέλος μπλοκ σας. Μπορείτε να παρακολουθήσει αυτό το γεγονός ως εξής:

AppDomain.CurrentDomain.UnhandledException += new
System.UnhandledExceptionEventHandler(CatchClrExceptions);
Απαντήθηκε 20/09/2008 στις 16:52
πηγή χρήστη

ψήφοι
4

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

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

Δεν υπάρχει ενιαίο σημείο λύση σε αυτό το είδος του λάθους. Θα πρέπει να τεθεί ένα χειριστή πραγματική εξαίρεση (α catch μπλοκ) ανάντη από όλους τους χώρους, όπου παρουσιάζεται αυτό το σφάλμα και τη διαβιβάζει στο (για παράδειγμα) ένα παγκόσμιο μέθοδο χειρισμού / τάξη που θα καθορίσει εάν είναι ασφαλές απλά να αναφέρει και να συνεχίσει, με βάση τύπου ή / και του περιεχομένου εξαίρεση.

Επεξεργασία: Είναι δυνατόν να απενεργοποιήσετε (= hack) ο μηχανισμός αναφοράς σφάλματος ενσωματωμένο στα Windows έτσι την υποχρεωτική «συντριβή και έγκαυμα» διαλόγου δεν παίρνει εμφανίζεται όταν η εφαρμογή σας πηγαίνει προς τα κάτω. Ωστόσο, αυτό ισχύει για όλες τις εφαρμογές του συστήματος, όχι μόνο δική σας.

Απαντήθηκε 04/08/2008 στις 11:20
πηγή χρήστη

ψήφοι
3

Είναι αυτό μια εφαρμογή κονσόλας ή μια εφαρμογή Windows Forms; Εάν είναι μια .NET 1.1 εφαρμογή κονσόλας αυτό είναι, δυστυχώς, από το σχεδιασμό - είναι επιβεβαιώνεται από την dev MSFT στη δεύτερη θέση blog που αναφέρονται :

BTW, στο 1,1 μηχάνημα μου το παράδειγμα από το MSDN έχει το αναμενόμενο αποτέλεσμα? είναι ακριβώς ότι η δεύτερη γραμμή δεν εμφανίζεται μέχρι να έχετε συνδεδεμένο ένα πρόγραμμα εντοπισμού σφαλμάτων (ή όχι). Σε v2 έχουμε γυρίσει τα πράγματα γύρω έτσι ώστε οι πυρκαγιές περίπτωση UnhandledException πριν από τις αποδίδει πρόγραμμα εντοπισμού σφαλμάτων, η οποία φαίνεται να είναι αυτό που περιμένουν οι περισσότεροι άνθρωποι.

Ακούγεται σαν .NET 2.0 το κάνει αυτό καλύτερα (δόξα τω Θεώ), αλλά ειλικρινά, ποτέ δεν είχα το χρόνο να πάει πίσω και να ελέγξετε.

Απαντήθηκε 04/08/2008 στις 03:45
πηγή χρήστη

ψήφοι
1

Πρόκειται για μια εφαρμογή Μορφές των Windows. Οι εξαιρέσεις που εμπίπτουν στο πεδίο εφαρμογής Application.ThreadException δουλεύουν μια χαρά, και δεν παίρνω το άσχημο .NET κουτί εξαίρεση ( OKγια να τερματίσει, Cancelνα διορθώσετε; που ήρθε με αυτό ??).

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

Γι 'αυτό και θα πρέπει απλά να ελπίζουμε να μην υπάρχουν και κάποιες άλλες περιπτώσεις που θα μπορούσε να προκαλέσει εξαιρέσεις δεν πρέπει να πιαστεί από τον χειριστή Application.ThreadException.

Απαντήθηκε 04/08/2008 στις 03:54
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more