diff --git a/libraries/Microsoft.Bot.Builder.Dialogs/ObjectPath.cs b/libraries/Microsoft.Bot.Builder.Dialogs/ObjectPath.cs index 5da5621078..158a2fe7d0 100644 --- a/libraries/Microsoft.Bot.Builder.Dialogs/ObjectPath.cs +++ b/libraries/Microsoft.Bot.Builder.Dialogs/ObjectPath.cs @@ -120,7 +120,17 @@ public static bool TryGetPathValue(object obj, string path, out T value) } } - value = MapValueTo(result); + try + { + value = MapValueTo(result); + } +#pragma warning disable CA1031 // Do not catch general exception types + catch (Exception) +#pragma warning restore CA1031 // Do not catch general exception types + { + return false; + } + return true; } diff --git a/tests/Microsoft.Bot.Builder.Dialogs.Tests/DialogStateManagerTests.cs b/tests/Microsoft.Bot.Builder.Dialogs.Tests/DialogStateManagerTests.cs index 3d110ddaa8..2f29357fe8 100644 --- a/tests/Microsoft.Bot.Builder.Dialogs.Tests/DialogStateManagerTests.cs +++ b/tests/Microsoft.Bot.Builder.Dialogs.Tests/DialogStateManagerTests.cs @@ -312,6 +312,36 @@ await CreateDialogContext(async (dc, ct) => }).StartTestAsync(); } + [Fact] + public async Task TestTryGetValueWithWrongType() + { + await CreateDialogContext(async (dc, ct) => + { + dc.State.SetValue("user.name.first", "joe"); + Assert.Equal(false, dc.State.TryGetValue("user.name.first", out var val)); + Assert.Equal(true, dc.State.TryGetValue("user.name.first", out var val2)); + Assert.Equal("joe", val2); + + dc.State.SetValue("user.age", 19); + Assert.Equal(true, dc.State.TryGetValue("user.age", out var val3)); + Assert.Equal("19", val3); + Assert.Equal(true, dc.State.TryGetValue("user.age", out var val4)); + Assert.Equal(19, val4); + + dc.State.SetValue("user.salary", "10000"); + Assert.Equal(true, dc.State.TryGetValue("user.salary", out var val5)); + Assert.Equal("10000", val5); + Assert.Equal(true, dc.State.TryGetValue("user.salary", out var val6)); + Assert.Equal(10000, val6); + dc.State.SetValue("user.foo", foo); + + Assert.Equal(false, dc.State.TryGetValue("user.foo", out var val7)); + Assert.Equal(true, dc.State.TryGetValue("user.foo", out var val8)); + Assert.Equal(false, dc.State.TryGetValue>("user.foo", out var val9)); + Assert.Equal(true, dc.State.TryGetValue("user.foo", out var val10)); + }).StartTestAsync(); + } + [Fact] public async Task TestGetValueT() {