Преглед на файлове

HLE: misc: throw a more descriptive error when the loaded processes doesn't contain _latestPid (likely missing FW)

Evan Husted преди 1 година
родител
ревизия
017f46f318
променени са 3 файла, в които са добавени 45 реда и са изтрити 7 реда
  1. 10 0
      src/Ryujinx.Common/RyujinxException.cs
  2. 11 1
      src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs
  3. 24 6
      src/Ryujinx/Program.cs

+ 10 - 0
src/Ryujinx.Common/RyujinxException.cs

@@ -0,0 +1,10 @@
+using System;
+
+namespace Ryujinx.Common
+{
+    public class RyujinxException : Exception
+    {
+        public RyujinxException(string message) : base(message)
+        { }
+    }
+}

+ 11 - 1
src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs

@@ -26,7 +26,17 @@ namespace Ryujinx.HLE.Loaders.Processes
 
         private ulong _latestPid;
 
-        public ProcessResult ActiveApplication => _processesByPid[_latestPid];
+        public ProcessResult ActiveApplication
+        {
+            get
+            {
+                if (!_processesByPid.TryGetValue(_latestPid, out ProcessResult value))
+                    throw new RyujinxException(
+                        $"The HLE Process map did not have a process with ID {_latestPid}. Are you missing firmware?");
+                
+                return value;
+            }
+        }
 
         public ProcessLoader(Switch device)
         {

+ 24 - 6
src/Ryujinx/Program.cs

@@ -21,6 +21,7 @@ using Ryujinx.Graphics.Vulkan.MoltenVK;
 using Ryujinx.Headless;
 using Ryujinx.SDL2.Common;
 using System;
+using System.Collections.Generic;
 using System.IO;
 using System.Linq;
 using System.Runtime.InteropServices;
@@ -243,16 +244,33 @@ namespace Ryujinx.Ava
                     : $"Launch Mode: {AppDataManager.Mode}");
         }
 
-        internal static void ProcessUnhandledException(object sender, Exception ex, bool isTerminating)
+        internal static void ProcessUnhandledException(object sender, Exception initialException, bool isTerminating)
         {
             Logger.Log log = Logger.Error ?? Logger.Notice;
-            string message = $"Unhandled exception caught: {ex}";
 
-            // ReSharper disable once ConstantConditionalAccessQualifier
-            if (sender?.GetType()?.AsPrettyString() is { } senderName)
-                log.Print(LogClass.Application, message, senderName);
+            List<Exception> exceptions = [];
+
+            if (initialException is AggregateException ae)
+            {
+                exceptions.AddRange(ae.InnerExceptions);
+            }
             else
-                log.PrintMsg(LogClass.Application, message);
+            {
+                exceptions.Add(initialException);
+            }
+
+            foreach (var e in exceptions)
+            {
+                string message = $"Unhandled exception caught: {e}";
+                // ReSharper disable once ConstantConditionalAccessQualifier
+                if (sender?.GetType()?.AsPrettyString() is { } senderName)
+                    log.Print(LogClass.Application, message, senderName);
+                else
+                    log.PrintMsg(LogClass.Application, message);
+            }
+            
+
+
 
             if (isTerminating)
                 Exit();