diff --git a/src/Ryujinx.Common/RyujinxException.cs b/src/Ryujinx.Common/RyujinxException.cs new file mode 100644 index 000000000..dbb5184e4 --- /dev/null +++ b/src/Ryujinx.Common/RyujinxException.cs @@ -0,0 +1,10 @@ +using System; + +namespace Ryujinx.Common +{ + public class RyujinxException : Exception + { + public RyujinxException(string message) : base(message) + { } + } +} diff --git a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs b/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs index ebbeb1398..6279ec3b4 100644 --- a/src/Ryujinx.HLE/Loaders/Processes/ProcessLoader.cs +++ b/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) { diff --git a/src/Ryujinx/Program.cs b/src/Ryujinx/Program.cs index 6f0f3e12e..b9aa402c5 100644 --- a/src/Ryujinx/Program.cs +++ b/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 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();