Klassen und Behandlung von Ausnahmen / Fehlern

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Klassen und Behandlung von Ausnahmen / Fehlern

Re: Klassen und Behandlung von Ausnahmen / Fehlern

by just me » 29 Jun 2020, 05:11

Moin, Moin,

wenn Du in der direkten Umgebung der auslösenden Anweisung eine Fehlerbehandlung durchführen willst, bleibt Dir für von AHK generierte Ausnahmen meiner Meinung nach nichts anderes übrig. Wenn Du - wie im Beispiel - selbst Ausnahmen generierst, sehe ich die Notwendigkeit nicht. DllCall() erzeugt automatische Ausnahmen in AHK 1.1 überhaupt nur dann, wenn die Funktion in einem Try Block steht.

Klassen und Behandlung von Ausnahmen / Fehlern

by jNizM » 29 Jun 2020, 04:15

Moin,

gibt es eigtl. in AHK ein Best Practise, was das Behandlung von Ausnahmen / Fehlern in Klassen angeht? (Exception Handling)

Vorallem, wenn man DllCall's in Methoden auslagert und gerne die Fehler abfangen und trotzdem den Speicher bereinigen will.

Am besten ohne in jeder Methode ein try, catch, finally einzubauen.


Finde das halt sehr unschön, bzw aufgebläht.

Code: Select all

Irgendwas.UserMethode()


class Irgendwas
{
	; === FÜR DIE BENUTZUNG AUßERHALB ===============================
	UserMethode()
	{
		handle := this.OpenHandle()
		Ret_A  := this.MethodeA(handle)
		Ret_B  := this.MethodeB(handle, Ret_A)
		this.Free(handle)
		return Ret_B
	}

	; === INTERN ====================================================
	OpenHandle()
	{
		return DllCall("ÖffneEtwas", "ptr")
	}

	MethodeA(handle)
	{
		try ; probiere
		{
			if !(ret := DllCall("TueIrgendwasA", "ptr", handle, "ptr"))
				throw Exception("TueIrgendwasA: " A_LastError, -1)
			return ret
		}
		catch exception
		{
			throw Exception
		}
		finally ; bereinige wenn fehlschlägt
		{
			if (handle)
				this.Free(handle)
		}
	}

	MethodeB(handle, irgendwasA)
	{
		try ; probiere
		{
			if !(ret := DllCall("TueIrgendwasB", "ptr", handle, "ptr", irgendwasA, "ptr"))
				throw Exception("TueIrgendwasB: " A_LastError, -1)
			return ret
		}
		catch exception
		{
			throw Exception
		}
		finally ; bereinige wenn fehlschlägt
		{
			if (handle)
				this.Free(handle)
		}
	}

	Free(handle)
	{
		DllCall("BereinigeEtwas", "ptr", handle)
	}
}
Oder muss ich den Weg so gehen?

Top