Add exception logging to service classes for improved debuggability#1728
Draft
Add exception logging to service classes for improved debuggability#1728
Conversation
Co-authored-by: kazo0 <4793020+kazo0@users.noreply.github.com>
Co-authored-by: kazo0 <4793020+kazo0@users.noreply.github.com>
|
|
1 similar comment
|
|
Copilot
AI
changed the title
[WIP] Fix exceptions not displaying actionable output in NativeAOT
Add exception logging to service classes for improved debuggability
Jan 27, 2026
jonpryor
added a commit
that referenced
this pull request
Jan 27, 2026
Context: #1726 Context: #1728 Build and run `Chefs.csproj` for e.g. net10.0-desktop and NativeAOT while using Uno 6.6.0-dev.3: sed -i '' 's/"Uno.Sdk": ".*"/"Uno.Sdk": "6.6.0-dev.3"/g' global.json git clean -xdf Chefs{,.Api} dotnet publish -c Release -r osx-x64 -f net10.0-desktop -p:TargetFrameworkOverride=net10.0-desktop \ -bl Chefs/Chefs.csproj -p:UseSkiaRendering=true -p:SkiaPublishAot=true \ -p:SkiaPublishAot=true \ -p:IlcGenerateMapFile=true -p:IlcGenerateMstatFile=true -p:IlcGenerateDgmlFile=true -p:IlcGenerateMetadataLog=true \ -p:EmitCompilerGeneratedFiles=true -p:CompilerGeneratedFilesOutputPath=`pwd`/_gen Chefs/bin/Release/net10.0-desktop/osx-x64/publish/Chefs From the launch screen: 1. Click **Skip** 2. Click ** Sign in with Apple** 3. Click **🔍Search** on the left 4. In the Search box, type `m` When doing this with e838af9, the search results screen shows: > An error occurred. ![Search Results > An error occurred][0] …which isn't particularly helpful. If you do all this with #1728 applied, the Console log shows: fail: Chefs.Business.Services.Recipes.RecipeService[0] Failed to search recipes with term m System.InvalidOperationException: Reflection-based serialization has been disabled for this application. Use the IServiceCollection.AddJsonTypeInfo() or IHostBuilder.UseSerialization(IHostBuilder, IEnumerable<IJsonTypeInfoResolver>, Action<IServiceCollection>) extension methods to enable JSON deserialization for type `System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Chefs.Business.Models.SearchHistory, Chefs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]`. at Uno.Extensions.Serialization.SystemTextJsonSerializer.FromStream(Stream, Type) + 0x88 at Uno.Extensions.Serialization.SerializerExtensions.FromStream[T](ISerializer, Stream) + 0x34 at Uno.Extensions.Configuration.WritableOptions`1.<UpdateAsync>d__10.MoveNext() + 0x292 --- End of stack trace from previous location --- at Chefs.Business.Services.Recipes.RecipeService.<SaveSearchHistory>d__51.MoveNext() + 0x5d --- End of stack trace from previous location --- at Chefs.Business.Services.Recipes.RecipeService.<SearchCore>d__24.MoveNext() + 0x8a --- End of stack trace from previous location --- at Chefs.Business.Services.Recipes.RecipeService.<Search>d__23.MoveNext() + 0x175 which shows what the problem is: `RecipeService.Search()` tries to save the search history, but JSON serialization does not support `Dictionary<string, SearchHistory>`, so an `InvalidOperationException` is thrown. (Unfortunately the exception is basically swallowed; PR #1728 adds logging to that code path, and was needed to diagnose this issue.) Update `MockEndpointContext` to emit JSON serialization metadata for `Dictionary<string, SearchHistory>`, so that Search now works. [0]: https://private-user-images.githubusercontent.com/155958/541004949-2be43b36-4eb1-42b1-b91d-e53a5e5545de.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Njk1NDE0NjMsIm5iZiI6MTc2OTU0MTE2MywicGF0aCI6Ii8xNTU5NTgvNTQxMDA0OTQ5LTJiZTQzYjM2LTRlYjEtNDJiMS1iOTFkLWU1M2E1ZTU1NDVkZS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMTI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDEyN1QxOTEyNDNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yZDlkNzA5OTM0NzI2NWMxMjg4Njc0MTVmNWMyNjkzYTQzY2MzYWIxYTAzNGRlZjE5NjlmN2FjNzRkOGIxYjJiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.a2gF7zICQIBUqWB-qdZv58UDg_DIwzKWAD8pNKJtu_g
7 tasks
jonpryor
added a commit
that referenced
this pull request
Jan 27, 2026
Context: #1726 Context: #1728 Build and run `Chefs.csproj` for e.g. net10.0-desktop and NativeAOT while using Uno 6.6.0-dev.3: sed -i '' 's/"Uno.Sdk": ".*"/"Uno.Sdk": "6.6.0-dev.3"/g' global.json git clean -xdf Chefs{,.Api} dotnet publish -c Release -r osx-x64 -f net10.0-desktop -p:TargetFrameworkOverride=net10.0-desktop \ -bl Chefs/Chefs.csproj -p:UseSkiaRendering=true -p:SkiaPublishAot=true \ -p:SkiaPublishAot=true \ -p:IlcGenerateMapFile=true -p:IlcGenerateMstatFile=true -p:IlcGenerateDgmlFile=true -p:IlcGenerateMetadataLog=true \ -p:EmitCompilerGeneratedFiles=true -p:CompilerGeneratedFilesOutputPath=`pwd`/_gen Chefs/bin/Release/net10.0-desktop/osx-x64/publish/Chefs From the launch screen: 1. Click **Skip** 2. Click ** Sign in with Apple** 3. Click **🔍Search** on the left 4. In the Search box, type `m` When doing this with e838af9, the search results screen shows: > An error occurred. ![Search Results > An error occurred][0] …which isn't particularly helpful. If you do all this with #1728 applied, the Console log shows: fail: Chefs.Business.Services.Recipes.RecipeService[0] Failed to search recipes with term m System.InvalidOperationException: Reflection-based serialization has been disabled for this application. Use the IServiceCollection.AddJsonTypeInfo() or IHostBuilder.UseSerialization(IHostBuilder, IEnumerable<IJsonTypeInfoResolver>, Action<IServiceCollection>) extension methods to enable JSON deserialization for type `System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[Chefs.Business.Models.SearchHistory, Chefs, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]`. at Uno.Extensions.Serialization.SystemTextJsonSerializer.FromStream(Stream, Type) + 0x88 at Uno.Extensions.Serialization.SerializerExtensions.FromStream[T](ISerializer, Stream) + 0x34 at Uno.Extensions.Configuration.WritableOptions`1.<UpdateAsync>d__10.MoveNext() + 0x292 --- End of stack trace from previous location --- at Chefs.Business.Services.Recipes.RecipeService.<SaveSearchHistory>d__51.MoveNext() + 0x5d --- End of stack trace from previous location --- at Chefs.Business.Services.Recipes.RecipeService.<SearchCore>d__24.MoveNext() + 0x8a --- End of stack trace from previous location --- at Chefs.Business.Services.Recipes.RecipeService.<Search>d__23.MoveNext() + 0x175 which shows what the problem is: `RecipeService.Search()` tries to save the search history, but JSON serialization does not support `Dictionary<string, SearchHistory>`, so an `InvalidOperationException` is thrown. (Unfortunately the exception is basically swallowed; PR #1728 adds logging to that code path, and was needed to diagnose this issue.) Update `MockEndpointContext` to emit JSON serialization metadata for `Dictionary<string, SearchHistory>`, so that Search now works. [0]: https://private-user-images.githubusercontent.com/155958/541004949-2be43b36-4eb1-42b1-b91d-e53a5e5545de.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Njk1NDE0NjMsIm5iZiI6MTc2OTU0MTE2MywicGF0aCI6Ii8xNTU5NTgvNTQxMDA0OTQ5LTJiZTQzYjM2LTRlYjEtNDJiMS1iOTFkLWU1M2E1ZTU1NDVkZS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMTI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDEyN1QxOTEyNDNaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yZDlkNzA5OTM0NzI2NWMxMjg4Njc0MTVmNWMyNjkzYTQzY2MzYWIxYTAzNGRlZjE5NjlmN2FjNzRkOGIxYjJiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.a2gF7zICQIBUqWB-qdZv58UDg_DIwzKWAD8pNKJtu_g
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
GitHub Issue (If applicable): #145
PR Type
What kind of change does this PR introduce?
What is the current behavior?
Exceptions thrown in service classes under
Chefs.Business.Servicesare swallowed silently with no console output, making NativeAOT debugging nearly impossible. Users see "An error occurred" with no actionable information in logs.What is the new behavior?
All public async methods in service classes now log exceptions before rethrowing. Adds
ILogger<T>to:ShareServiceRecipeServiceUserServiceCookbookServiceNotificationServicePattern applied:
Internal method calls use
*Corevariants directly to avoid redundant logging.PR Checklist
Please check if your PR fulfills the following requirements:
Screenshots Compare Test Runresults.Other information
No breaking changes—loggers are injected via existing DI infrastructure.
Internal Issue (If applicable):
Warning
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
crl.godaddy.com/usr/bin/dotnet dotnet build Chefs/Chefs.csproj -p:TargetFrameworkOverride=net9.0-desktop(dns block)/usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.chefs/.codeql-scratch/dbs/csharp/working/2B9D6FF9D398549B5FBB8065A02F803E/missingpackages_workingdir --packages /home/REDACTED/work/uno.chefs/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.chefs/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force(dns block)ocsp.godaddy.com/usr/bin/dotnet dotnet build Chefs/Chefs.csproj -p:TargetFrameworkOverride=net9.0-desktop(dns block)/usr/bin/dotnet dotnet restore --no-dependencies /home/REDACTED/work/uno.chefs/.codeql-scratch/dbs/csharp/working/2B9D6FF9D398549B5FBB8065A02F803E/missingpackages_workingdir --packages /home/REDACTED/work/uno.chefs/.codeql-scratch/dbs/csharp/working/missingpackages /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --configfile /home/REDACTED/work/uno.chefs/.codeql-scratch/dbs/csharp/working/nugetconfig/nuget.config --force(dns block)If you need me to access, download, or install something from one of these locations, you can either:
Original prompt
This section details on the original issue you should resolve
<issue_title>Exceptions can be swallowed with no actionable output</issue_title>
<issue_description>(All the interesting bugs are under NativeAOT!)
Build and run Uno.Chefs for macOS desktop under NativeAOT, which in turn requires using Uno.Sdk 6.6.0:
From the launch screen:
mCurrent behavior
The search results screen shows:
The console log shows nothing.
The lack of any information about the error that occurred makes it difficult to fix the bug.
Desired behavior
The console log should show the exception that was thrown.
Implementation
For all
classes underneath theChefs.Business.Servicesnamespace, including:Chefs/Business/Services/Sharing/ShareService.csChefs/Business/Services/Recipes/RecipeService.csChefs/Business/Services/Users/UserService.csChefs/Business/Services/Cookbooks/CookbookService.csChefs/Business/Services/Notifications/NotificationService.csPerform the following changes:
Add an
ILogger<T> loggerconstructor parameter, in whichTis the declaring type:For each
publicmethod which returnsTask,Task<T>,ValueTask, orValueTask<T>, rename the method by appending aCoresuffix, and change the visibility toprivate:For each method changed in (2), write a method with the original method declaration which invokes the
Coresuffixed method, wrapping the invocation in atry/catchblock. Thecatchblock should write the exception to theloggerparameter, and re-throw the exception:For example, the complete diff to
ShareServiceis: