Ich programmiere in .NET, C#. Das übliche (ziemlich nervige) Prozedere zur Ausnahmebehandlung ist mir ja schon klar - um eine Methode M diesbezüglich abzusichern, überprüfe ich Folgendes:
- Für alle Variablen, Felder etc.: Können diese unbeabsichtigt null sein?
- Für alle aufgerufenen Methoden (und strenggenommen auch Properties): Welche Ausnahmen können auftreten? Diese mit catch absichern ...
- Zuletzt mittels XML-Dokumentation kennzeichnen, welche Ausnahmen M wiederum throwen kann.
Jetzt verwende ich aber zuweilen native Methoden wie z. B. QueryFullProcessImageName aus der kernel32.dll (btw: um die Codierung A/W kümmert sich .NET selbst?):
[DllImport("Kernel32.dll")]
static extern bool QueryFullProcessImageName(
[In] IntPtr processHandle,
[In] uint flags,
[Out] StringBuilder exeName,
[In, Out] ref uint size
);
Aus der oben schon verlinkten Spezifikation würde ich nun vermuten, dass die Funktion einen Fehler, z. B. durch mangelnde Berechtigungen, nur dadurch kommunizieren kann, dass sie "zero", also false, zurückgibt. Es ist nicht möglich, dass eine externe Methode eine Exception auswirft, korrekt? Darauf sollte ich reagieren und eine Win32Exception auswerfen, deren Standardkonstruktor laut Beschreibung von selber GetLastError() aufruft? Also etwa:
static string GetMainModuleFileName(this Process process, int buffer = 1024)
{
var fileNameBuilder = new StringBuilder(buffer);
uint bufferLength = (uint)fileNameBuilder.Capacity + 1;
if (!QueryFullProcessImageName(process.Handle, 0, fileNameBuilder, ref bufferLength))
throw new Win32Exception();
return fileNameBuilder.ToString();
}
Aber um endlich zur eigentlichen Frage zu kommen: Woher weiß ich denn nun, welche Fehlerfälle so eine native Methode vorsieht? Irgendwie muss ich ja an den oder die Aufrufer von GetMainModuleFileName() kommunizieren, welche Fehlerursachen möglich sind.
Über euren Rat würde ich mich freuen.