Gå til innhold

Hvordan fange ville exceptions?


Anbefalte innlegg

Hei!

 

Dersom (les: når) programmet mitt krasjer på andre maskiner enn min egen, ønsker jeg å ha en form som minner om Microsoft sin, dvs en som lar brukeren trykke på en knapp og sende litt informasjon om feilen til meg.

 

I mine gamle VB-dager var det ganske enkelt; jeg bare valgte det programinnstillingene hva som skulle skje ved unhandled exception, og vips så funket det.

 

I C# regner jeg med at det må tukles med Program.cs, og har prøvd på følgende:

 

[STAThread]
	static void Main()
	{
		try
		{
			Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);
			Application.Run(new frmMain());
		}
		catch (Exception ex)
		{
			MessageBox.Show(ex.Message);
		}
	}

	static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
	{
		MessageBox.Show(e.Exception.Message);
	}

 

Og for å teste skriver jeg følgende:

 

public frmMain()
	{
			throw new Exception("HEufeiiu");
	}

 

Men det funker ikke. Når jeg debugger får jeg den vanlige gule meldingen på linjen, og informasjon om feilmeldingen (dvs "HEufeiiu"). Når jeg prøver å kjøre programmet utenfor VS, så får jeg bare den stygge MS-boksen om at programmet har krasjet.

 

Hvordan bør jeg gå frem for å fange opp alle feilene jeg ikke har tatt høyde for i programmet?

 

 

Takk,

Degeim

Lenke til kommentar
Videoannonse
Annonse

Du kna også endre hvordan .NET reagerer på unahndled exceptions ved å kalle

 

Application.SetUnhandledExceptionMode før Application.Run

 

Setter du den til Catch, vil programmet fortsette som om ingenting har skjedd.

 

Setter du den til Automatic, blir det ThreadException som behandler den (altså den du har spesifisert)

Lenke til kommentar

Humm ...

 

Nå har jeg oppdatert til følgende:

 

[STAThread]
	static void Main()
	{
		try
		{
			Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic);

			Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);

			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);
			Application.Run(new frmMain());
		}
		catch (Exception ex)
		{
			  MessageBox.Show(ex.Message);
		}
	}

	static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
	{
		MessageBox.Show(e.Exception.Message);
	}

 

Men fremdeles får jeg bare teite "Det har oppstått et problem, og programmet må lukkes. Vi beklager det inntrufne" :(

Endret av Degeim
Lenke til kommentar

Det beste vil vel strengt tatt å legge inn exception handling alle steder i koden hvor det kan oppstå. Bedre enn å skulle fange opp programkrasj, samme pokker hva som har gått galt underveis. Fanger du de opp der de skjer, så kan du jo korrigere og gi en feilmelding uten å avslutte hele programmet.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...