Exception wird in Main(string[]) nicht abgefangen

  • C#

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von BeatsleigherXDA.

    Exception wird in Main(string[]) nicht abgefangen

    Guten Abend Leute,

    Ich habe in meiner Anwendung eine Abfrage, ob die Anwendung mit SuperUser-Privilegien (oder Admin auf Windows) ausgeführt wird.
    Wenn nicht, wird eine PrivilegeNotHeldException geschmissen, die in der Main-Methode abgefangen werden soll und dementsprechend die Anwendung
    neu gestartet (oder halt nicht) wird.

    ApplicationConfig.cs

    C#-Quellcode

    1. // Check for admin privileges to create the necessary files and directories.
    2. if (!Program.IsElevated)
    3. throw new PrivilegeNotHeldException($"Missing administrator privileges to write to { WebXConfig.ConfigDir }");


    Program.cs

    C#-Quellcode

    1. try {
    2. _applicationConfig.LoadConfig();
    3. } catch (PrivilegeNotHeldException ex) {
    4. Console.Write("Application requires superuser privileges on first boot!\n" +
    5. "For WebX to be able to run, certain files and directories are required.\n" +
    6. "If you do not want WebX to restart with superuser privileges, please select [N]o.\n" +
    7. "If you choose not to restart WebX w/ superuser privileges, please manually create the following directories:\n" +
    8. " - {0}\n" +
    9. " - {1}\n" +
    10. " - {2}\n" +
    11. " - {3}\n\n" +
    12. "Select: [Y]es to restart, [n]o to exit: ",
    13. _applicationConfig.WebXConfig.ConfigDir,
    14. _applicationConfig.WebsiteConfigDir,
    15. _applicationConfig.WebXConfig.WwwRoot,
    16. _applicationConfig.WebXConfig.ScriptDir
    17. );
    18. var input = Console.ReadLine();
    19. if (string.IsNullOrEmpty(input) || input.ToLowerInvariant() == "y") {
    20. ElevatedRestart(args);
    21. return NoError;
    22. } else return MiscellaneousError;
    23. }


    Das Neustarten der Anwendung geschieht ausschließlich über den Catch.
    Allerdings wird dieser nicht abgefangen. Lass ich die Anwendung zum Ende laufen, schmeißt Mono den Fehler als unbehandelte Ausnahme.

    Quellcode

    1. [ERROR] FATAL UNHANDLED EXCEPTION: System.Security.AccessControl.PrivilegeNotHeldException: Missing administrator privileges to write to /etc/webx
    2. at WebX.Config.ApplicationConfig.LoadConfig () [0x00495] in /home/simon/RiderProjects/WebX/WebX/Config/ApplicationConfig.cs:166
    3. at System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__6_1 (System.Object state) [0x00000] in <0f8aeac9d63d4b8aa575761bb4e65b79>:0
    4. at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context (System.Object state) [0x00007] in <0f8aeac9d63d4b8aa575761bb4e65b79>:0
    5. at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserv$
    6. at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx$
    7. at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () [0x00021] in <0f8aeac9d63d4b8aa575761bb4e65b79>:0
    8. at System.Threading.ThreadPoolWorkQueue.Dispatch () [0x00074] in <0f8aeac9d63d4b8aa575761bb4e65b79>:0
    9. at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () [0x00000] in <0f8aeac9d63d4b8aa575761bb4e65b79>:0


    Nehme ich eine andere Ausnahme, oder fange ich generell ab (Exception ex), beobachte ich weiterhin das obige Verhalten.
    Hat jemand eine Idee?

    EDIT:

    Wird die Methode nicht asynchron aufgerufen, wird die Ausnahme abgefangen.
    Jedoch würde ich die Methode gerne asynchron behalten.
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „BeatsleigherXDA“ ()

    Damit hast Du Deine eigene Frage zwar beantwortet, aber gleichzeitig einen wohl unlösbaren Wunsch geäußert. "Was in Bielefeld passiert, bleibt in Bielefeld." Oder so ähnlich. Du kannst keine threadfremden Exceptions einfach so abfangen.
    Du kannst schon über Umwege threadfremde Exces abfangen, aber da musst Du schon selber ins Threadgeschehen eingreifen können, wohl die dort auftretenden Exceptions selber abfangen und dann an den Mainthread weitergeben. Da ich auf Anhieb keinen nebenläufigen Code sehe, wird's aber schwierig.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hm, schade. Ich hatte irgendwie den Eindruck, dass asynchrone Methoden die Exception an den aufrufenden Thread weitergeben.
    Meine nächste Vermutung wäre gewesen, dass es an Mono liegen könnte - da ich momentan mit Rider auf Linux entwickle (soll mal eine Serveranwendung werden).
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln

    BeatsleigherXDA schrieb:

    da ich momentan mit Rider auf Linux entwickle (soll mal eine Serveranwendung werden).


    Dann nutze doch eher .Net Core. Das läuft native auf Linux ohne Mono-quatsch. (wäre jetzt als alternative zu Mono zusehen da es die möglichkeit gibt.)
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    *Vollzitat entfernt*

    Ist leider keine Alternative, da .Net Core nicht alles bereitstellt, was ich verwende. Dazu sind einige der Bibliotheken nicht auf .NetCore ausgelegt.
    "Nichts ist unendlich, bis auf die menschliche Dummheit" - Albert Einstein
    "Man sollte nicht alles vertrauen, was im Netz steht" - Abraham Lincoln

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()