diff --git a/sdk-dotnet/Examples/ExceptionsHandlerExample/ExceptionsHandlerExample.csproj b/sdk-dotnet/Examples/ExceptionsHandlerExample/ExceptionsHandlerExample.csproj
new file mode 100644
index 000000000..1cb816f31
--- /dev/null
+++ b/sdk-dotnet/Examples/ExceptionsHandlerExample/ExceptionsHandlerExample.csproj
@@ -0,0 +1,14 @@
+
+
+
+ Exe
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
diff --git a/sdk-dotnet/Examples/ExceptionsHandlerExample/Program.cs b/sdk-dotnet/Examples/ExceptionsHandlerExample/Program.cs
new file mode 100644
index 000000000..9a135dd8a
--- /dev/null
+++ b/sdk-dotnet/Examples/ExceptionsHandlerExample/Program.cs
@@ -0,0 +1,70 @@
+using ExceptionsHandler;
+using LittleHorse.Sdk;
+using LittleHorse.Sdk.Worker;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace ExceptionsHandlerExample;
+
+public abstract class Program
+{
+ private static ServiceProvider? _serviceProvider;
+
+ private static void SetupApplication()
+ {
+ _serviceProvider = new ServiceCollection()
+ .AddLogging(config =>
+ {
+ config.AddConsole();
+ config.SetMinimumLevel(LogLevel.Debug);
+ })
+ .BuildServiceProvider();
+ }
+
+ private static LHConfig GetLHConfig(string[] args, ILoggerFactory loggerFactory)
+ {
+ var config = new LHConfig(loggerFactory);
+
+ string filePath = Path.Combine(Directory.GetCurrentDirectory(), ".config/littlehorse.config");
+ if (File.Exists(filePath))
+ config = new LHConfig(filePath, loggerFactory);
+
+ return config;
+ }
+
+ private static List> GetTaskWorkers(LHConfig config)
+ {
+ MyWorker executableExceptionHandling = new MyWorker();
+ var workers = new List>
+ {
+ new(executableExceptionHandling, "fail", config),
+ new(executableExceptionHandling, "fail-new-process", config),
+ new(executableExceptionHandling, "technical-failure", config),
+ new(executableExceptionHandling, "my-task", config)
+ };
+
+ return workers;
+ }
+
+ static void Main(string[] args)
+ {
+ SetupApplication();
+ if (_serviceProvider != null)
+ {
+ var loggerFactory = _serviceProvider.GetRequiredService();
+ var config = GetLHConfig(args, loggerFactory);
+ var workers = GetTaskWorkers(config);
+ foreach (var worker in workers)
+ {
+ worker.RegisterTaskDef();
+ }
+
+ Thread.Sleep(300);
+
+ foreach (var worker in workers)
+ {
+ worker.Start();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/sdk-dotnet/Examples/ExceptionsHandlerExample/README.md b/sdk-dotnet/Examples/ExceptionsHandlerExample/README.md
new file mode 100644
index 000000000..33c8e73ac
--- /dev/null
+++ b/sdk-dotnet/Examples/ExceptionsHandlerExample/README.md
@@ -0,0 +1,31 @@
+## Running Exceptions Handler Example
+
+This is a simple demonstration of a workflow that handles the failure of a task with
+the handleException() functionality, which spawns a child thread and then
+resumes execution when the handler thread completes.
+
+Let's run the example in `ExceptionsHandlerExample`
+
+```
+dotnet build
+dotnet run
+```
+
+In another terminal, use `lhctl` to run the workflow:
+
+```
+lhctl run example-exception-handler
+```
+
+In addition, you can check the result with:
+
+```
+# This call shows the result
+lhctl get wfRun
+
+# This will show you all nodes in tha run
+lhctl list nodeRun
+
+# This shows the task run information
+lhctl get taskRun
+```
diff --git a/sdk-dotnet/Examples/ExceptionsHandlerExample/Worker.cs b/sdk-dotnet/Examples/ExceptionsHandlerExample/Worker.cs
new file mode 100644
index 000000000..efc3c2961
--- /dev/null
+++ b/sdk-dotnet/Examples/ExceptionsHandlerExample/Worker.cs
@@ -0,0 +1,56 @@
+using LittleHorse.Common.Proto;
+using LittleHorse.Sdk.Worker;
+using LHTaskException = LittleHorse.Sdk.Exceptions.LHTaskException;
+
+namespace ExceptionsHandler
+{
+ public class MyWorker
+ {
+ [LHTaskMethod("fail")]
+ public void Fail()
+ {
+ Random random = new Random();
+ int randomNumber = random.Next(6, 10);
+ var message = $"Throw New Failing Task {randomNumber}.";
+ if (randomNumber > 5)
+ {
+ throw new LHTaskException("Fail", message);
+ }
+
+ Console.WriteLine(message);
+ }
+
+ [LHTaskMethod("fail-new-process")]
+ public void FailNewProcess()
+ {
+ Random random = new Random();
+ int randomNumber = random.Next(1, 10);
+ var message = $"Throw Other Failing Task {randomNumber}";
+ if (randomNumber < 8)
+ {
+ VariableValue content = new VariableValue
+ {
+ Str = "This is a problem"
+ };
+ throw new LHTaskException("Fail-New-Task", message, content);
+ }
+
+ Console.WriteLine(message);
+ }
+
+ [LHTaskMethod("technical-failure")]
+ public void FailForTechnicalReason()
+ {
+ String message = null!;
+ int result = message!.Length;
+ Console.WriteLine(result);
+ }
+
+ [LHTaskMethod("my-task")]
+ public string PassingTask()
+ {
+ Console.WriteLine("Executing passing task.");
+ return "woohoo!";
+ }
+ }
+}
\ No newline at end of file
diff --git a/sdk-dotnet/Examples/MaskedFieldsExample/MaskedFieldsExample.csproj b/sdk-dotnet/Examples/MaskedFieldsExample/MaskedFieldsExample.csproj
index f09e3ff5c..cb535cc93 100644
--- a/sdk-dotnet/Examples/MaskedFieldsExample/MaskedFieldsExample.csproj
+++ b/sdk-dotnet/Examples/MaskedFieldsExample/MaskedFieldsExample.csproj
@@ -4,7 +4,6 @@
net8.0
enable
enable
- enable
diff --git a/sdk-dotnet/Examples/MaskedFieldsExample/Program.cs b/sdk-dotnet/Examples/MaskedFieldsExample/Program.cs
index 7a378c616..b08038a39 100644
--- a/sdk-dotnet/Examples/MaskedFieldsExample/Program.cs
+++ b/sdk-dotnet/Examples/MaskedFieldsExample/Program.cs
@@ -1,6 +1,6 @@
-using Examples.BasicExample;
using LittleHorse.Sdk;
using LittleHorse.Sdk.Worker;
+using MaskedFieldsExample;
public class Program
{
diff --git a/sdk-dotnet/Examples/MaskedFieldsExample/Worker.cs b/sdk-dotnet/Examples/MaskedFieldsExample/Worker.cs
index 9760e3363..c7f6f4e0f 100644
--- a/sdk-dotnet/Examples/MaskedFieldsExample/Worker.cs
+++ b/sdk-dotnet/Examples/MaskedFieldsExample/Worker.cs
@@ -1,6 +1,6 @@
using LittleHorse.Sdk.Worker;
-namespace Examples.BasicExample
+namespace MaskedFieldsExample
{
public class MyWorker
{
diff --git a/sdk-dotnet/LittleHorse.Sdk.Tests/Helper/LHMappingHelperTest.cs b/sdk-dotnet/LittleHorse.Sdk.Tests/Helper/LHMappingHelperTest.cs
index 1a2691164..bfa10be77 100644
--- a/sdk-dotnet/LittleHorse.Sdk.Tests/Helper/LHMappingHelperTest.cs
+++ b/sdk-dotnet/LittleHorse.Sdk.Tests/Helper/LHMappingHelperTest.cs
@@ -72,6 +72,16 @@ public void LHHelper_WithSystemBytesVariableType_ShouldReturnLHVariableBytesType
[Fact]
public void LHHelper_WithSystemArrayObjectVariableType_ShouldReturnLHVariableJsonArrType()
+ {
+ var type = typeof(void);
+
+ var result = LHMappingHelper.MapDotNetTypeToLHVariableType(type);
+
+ Assert.True(result == VariableType.JsonObj);
+ }
+
+ [Fact]
+ public void LHHelper_WithSystemVoidVariableType_ShouldReturnLHVariableJsonObjType()
{
var test_allowed_types = new List() { typeof(List