display CommandParsingException gracefully (#5493)
* display CommandParsing gracefully This set of changes handles CommandParsingException gracefuly (so as not to show the user a stack trace) and generalizes graceful exception display somewhat away from being type-specific. * fix compile error by inlining constant * remove unused test logging
This commit is contained in:
parent
5aded80a7b
commit
e8c5d23c29
8 changed files with 42 additions and 13 deletions
|
@ -4,10 +4,6 @@ namespace Microsoft.DotNet.Cli.Utils
|
|||
{
|
||||
public class CommandUnknownException : GracefulException
|
||||
{
|
||||
public CommandUnknownException()
|
||||
{
|
||||
}
|
||||
|
||||
public CommandUnknownException(string commandName) : base(string.Format(
|
||||
LocalizableStrings.NoExecutableFoundMatchingCommand,
|
||||
commandName))
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
using System;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.Utils.ExceptionExtensions
|
||||
namespace Microsoft.DotNet.Cli.Utils
|
||||
{
|
||||
internal static class ExceptionExtensions
|
||||
{
|
||||
|
@ -11,5 +11,10 @@ namespace Microsoft.DotNet.Cli.Utils.ExceptionExtensions
|
|||
{
|
||||
Reporter.Verbose.WriteLine($"Warning: Ignoring exception: {e.ToString().Yellow()}");
|
||||
}
|
||||
|
||||
public static bool ShouldBeDisplayedAsError(this Exception e) =>
|
||||
e.Data.Contains(CLI_User_Displayed_Exception);
|
||||
|
||||
internal const string CLI_User_Displayed_Exception = "CLI_User_Displayed_Exception";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,12 +4,9 @@ namespace Microsoft.DotNet.Cli.Utils
|
|||
{
|
||||
public class GracefulException : Exception
|
||||
{
|
||||
public GracefulException()
|
||||
{
|
||||
}
|
||||
|
||||
public GracefulException(string message) : base(message)
|
||||
{
|
||||
Data.Add(ExceptionExtensions.CLI_User_Displayed_Exception, true);
|
||||
}
|
||||
|
||||
public GracefulException(string format, params string[] args) : this(string.Format(format, args))
|
||||
|
@ -18,6 +15,7 @@ namespace Microsoft.DotNet.Cli.Utils
|
|||
|
||||
public GracefulException(string message, Exception innerException) : base(message, innerException)
|
||||
{
|
||||
Data.Add(ExceptionExtensions.CLI_User_Displayed_Exception, true);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -10,7 +10,6 @@ using Microsoft.DotNet.Internal.ProjectModel;
|
|||
using Microsoft.DotNet.Internal.ProjectModel.Graph;
|
||||
using Microsoft.DotNet.Cli;
|
||||
using Microsoft.DotNet.Cli.Utils;
|
||||
using Microsoft.DotNet.Cli.Utils.ExceptionExtensions;
|
||||
using Microsoft.DotNet.Cli.Sln.Internal;
|
||||
using Microsoft.DotNet.ProjectJsonMigration.Rules;
|
||||
using Microsoft.DotNet.Tools.Common;
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using System;
|
||||
using Microsoft.DotNet.Cli.Utils;
|
||||
using Microsoft.DotNet.Tools;
|
||||
|
||||
namespace Microsoft.DotNet.Cli.CommandLine
|
||||
|
@ -18,6 +19,8 @@ namespace Microsoft.DotNet.Cli.CommandLine
|
|||
{
|
||||
Command = command;
|
||||
_isRequireSubCommandMissing = isRequireSubCommandMissing;
|
||||
|
||||
Data.Add("CLI_User_Displayed_Exception", true);
|
||||
}
|
||||
|
||||
public CommandLineApplication Command { get; }
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
using System;
|
||||
using System.Runtime.Loader;
|
||||
using Microsoft.DotNet.Cli.Utils;
|
||||
using Microsoft.DotNet.Cli.Utils.ExceptionExtensions;
|
||||
using Microsoft.DotNet.Tools.Common;
|
||||
|
||||
namespace Microsoft.DotNet.Cli
|
||||
|
|
|
@ -6,6 +6,7 @@ using System.Collections.Generic;
|
|||
using System.Linq;
|
||||
using System.Text;
|
||||
using Microsoft.DotNet.Cli.Utils;
|
||||
using Microsoft.DotNet.Cli.CommandLine;
|
||||
using Microsoft.DotNet.Configurer;
|
||||
using Microsoft.DotNet.PlatformAbstractions;
|
||||
using Microsoft.DotNet.Tools.Add;
|
||||
|
@ -76,9 +77,11 @@ namespace Microsoft.DotNet.Cli
|
|||
return ProcessArgs(args);
|
||||
}
|
||||
}
|
||||
catch (GracefulException e)
|
||||
catch (Exception e) when (e.ShouldBeDisplayedAsError())
|
||||
{
|
||||
Reporter.Error.WriteLine(CommandContext.IsVerbose() ? e.ToString().Red().Bold() : e.Message.Red().Bold());
|
||||
Reporter.Error.WriteLine(CommandContext.IsVerbose() ?
|
||||
e.ToString().Red().Bold() :
|
||||
e.Message.Red().Bold());
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
26
test/dotnet-new.Tests/NewCommandTests.cs
Normal file
26
test/dotnet-new.Tests/NewCommandTests.cs
Normal file
|
@ -0,0 +1,26 @@
|
|||
// Copyright (c) .NET Foundation and contributors. All rights reserved.
|
||||
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
||||
|
||||
using FluentAssertions;
|
||||
using Microsoft.DotNet.Tools.Test.Utilities;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Xunit;
|
||||
using Xunit.Abstractions;
|
||||
|
||||
namespace Microsoft.DotNet.New.Tests
|
||||
{
|
||||
public class NewCommandTests
|
||||
{
|
||||
[Fact]
|
||||
public void WhenSwitchIsSkippedThenItPrintsError()
|
||||
{
|
||||
var cmd = new DotnetCommand().Execute("new Web1.1");
|
||||
|
||||
cmd.ExitCode.Should().NotBe(0);
|
||||
|
||||
cmd.StdErr.Should().Be("Unrecognized command or argument 'Web1.1'");
|
||||
cmd.StdOut.Should().Be("Specify --help for a list of available options and commands.");
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue