返回值方法中的异常处理

本文关键字:异常处理 方法 返回值 | 更新日期: 2023-09-27 17:55:46

我正在研究一个应该遵循以下逻辑的方法:

  • 提示用户在控制台中输入数字
  • 尝试将输入转换为整数
    • 如果成功,则返回整数
    • 如果不成功,请将错误消息写入控制台并重新启动该方法

这是我所拥有的:

static int GetPlayers()
{
    int players = 0;
    Console.Write("How many people are playing?");
    try
    {
        players = Convert.ToInt16(Console.ReadLine());
    }
    catch (Exception e)
    {
        Console.Write(e.Message + "'n" +
            "----------");
        GetPlayers();
    }
    return players;
}

问题很简单,"并非所有代码路径都返回值"。我可以让它做我想做的事,但它会有几个丑陋的条件语句,反映我是多么业余。我正在寻找一个优雅的专业级解决方案来帮助我学习如何在未来正确处理这种类型的逻辑序列。

提前谢谢你!

返回值方法中的异常处理

您必须return该方法第二次调用的结果。如果只是调用该方法而不返回值,则结果将0(如果出错)。

你也可以做players = GetPlayers()我认为它更优雅,因为该方法只有一条出路

static int GetPlayers()
{
    int players = 0;
    Console.Write("How many people are playing?");
    try
    {
        players = Convert.ToInt16(Console.ReadLine());
    }
    catch (Exception e)
    {
        Console.Write(e.Message + "'n" +
            "----------");
       return GetPlayers(); // return the result
    }
    return players;
}

用法将如下所示:

static void Main(string[] args)
{
    var players = GetPlayers();
    Console.WriteLine("Players count: " + players);
    Console.ReadLine();
}

输出如下所示:

How many people are playing?s 
Input string was not in a correct format.
----------How many people are playing?9
Players count: 9

您可以使用 while 循环,并且仅在玩家设置正确后返回。

static int GetPlayers()
{
    int? players;
    Console.Write("How many people are playing?");
    while (players == null)
    {
      try
      {
          players = Convert.ToInt16(Console.ReadLine());
      }
      catch (Exception e)
      {
          Console.Write(e.Message + "'n" + "----------");
      }
    }
    return players.Value;
}

异常代码路径不返回值,编译器会注意到这一点。 这是一个错误,当您捕获异常时,这种情况并不少见。 您通常领先于不假设用户键入错误的内容有任何异常。 此外,这不是您唯一应该检查的事情,您也不会对-1或3000名玩家感到满意。

只需创建一个无限循环,当您获得正确的条目时,您就可以从中逃脱。 喜欢这个:

    static int GetPlayers(int max = 10) {
        for (;;) {
            Console.Write("Number of players: ");
            int players;
            if (int.TryParse(Console.ReadLine(), out players)) {
                if (players > 0 && players <= max) return players;
            }
            Console.WriteLine("  Oops, please type a number between 1 and " + max.ToString());
        }
    }

有些程序员发现for (;;)光栅,我不是其中之一。 如果您讨厌它,您可以使用while (true)