Neodchytena vynimka   otázka

C#

Zdravím narazil som na nasladujúci problém.

Vytvorím windows app a použijem odchytenie výnimky nasledovne:

            try
            {
                Application.Run(new Form1());
            }
            catch (Exception e)
            {
                MessageBox.Show("Moja vynimka!");  
            }

a potom na formulári v udalosti Load vyhodím výnimku takto

        private void Form1_Load(object sender, EventArgs e)
        {
            throw new Exception("MyException"); 
        }

pri kompilácii všetko krásne zbehne,ale ako náhle aplikáciu spustím z bin adresára cez exe výnimku to už nezachytí a aplikácia skončí výnimkou na obrazovke.

Podobný problém sa mi objavil aj pri tom keď sa pokúsim zavrieť okno takto:

        private void Form1_Load(object sender, EventArgs e)
        {
            this.Close(); 
        }

V tom to prípade mi to pri spustení cez exe z bin adresára hodí hlášku o tom, že program provedl neplatnu operaci a bude zrušen.

Otázka je v čom je chyba? Som z toho trochu zmetený.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Výjimka se vyhodí v jiném vlákně.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Taky jsem narazil na podobný problém a hledal řešení. Nakonec jsem našel kód, který funguje celkem spolehlivě, snad to někomu pomůže (tazateli už asi ne :-)):

using System.Threading;

namespace WindowsFormsApplication1
{
    class App
    {
        public static void OnUnhandled(Object sender, ThreadExceptionEventArgs e)
        {
            MessageBox.Show("Global Exeception");
            Application.ExitThread();
        }
    };

    static class Program
    {
        /// <summary>
        /// Hlavní vstupní bod aplikace.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.ThreadException += new ThreadExceptionEventHandler(App.OnUnhandled);
            Form1 form = new Form1();
            Application.Run(form);
        }
    }
}
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pro neošetřené vyjímky se používá tzv. globální handler. To je centrální místo, kde skončí všechny vyjímky dané aplikační domény, které nejsou ošetřené. Viz. http://msdn.microsoft.com/en-us/library/... nebo ve Visual Basicu My.Application.UnhandledException, případně Application.ThreadException pro vyjímky ve vláknech Windows Forms aplikací.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback