如果用户输入无效,程序不应崩溃并再次提示用户--重构Cli项目。

问题描述 投票:0回答:1

使用SWAPI构建了一个星际大战的api。 我想让我的代码满足以下要求。

-在你的程序中的任何一点,如果用户输入了无效的输入,程序不应该崩溃,并提示用户再试一次。

-除非用户明确选择退出,否则程序不应该在任何时候退出。

    def menu
    puts "Please select from a category below:" 
    StarwarsCLI::Category.all.each_with_index {|cat, i|

        puts "#{i + 1}. #{cat.name.capitalize} "

    }
    input = gets.chomp.to_i 
    category = StarwarsCLI::Category.all[input-1]
    StarwarsCLI::APIService.get_items(category)
    items = Module.const_get("StarwarsCLI::#{category.name.capitalize}").all

    if (input-1) == 0
        return list_people

    elsif (input-1) == 1
        return list_planets

    elsif (input-1) == 2
        return list_films

    elsif (input-1) == 3
        return list_species

    elsif (input-1) == 4
        return list_vehicles

    elsif (input-1) == 5
        return list_starships

    elsif input == "exit"
        exit 

    else
        puts "Not a valid option, choose another."
        return menu 
    end
end

在添加了以下几行之后

elsif input == "exit"
        exit 

    else
        puts "Not a valid option, choose another."
        return menu 

我的代码不再运行,我的错误信息是

Traceback (most recent call last):
    3: from bin/starwars:5:in `<main>'
    2: from /mnt/c/Users/skywalker/dev/flatiron/projects/StarwarsCLI/lib/star_wars/command_line_interface.rb:9:in `run'
    1: from /mnt/c/Users/skywalker/dev/flatiron/projects/StarwarsCLI/lib/star_wars/command_line_interface.rb:21:in `menu'
/mnt/c/Users/skywalker/dev/flatiron/projects/StarwarsCLI/lib/star_wars/api_manager.rb:17:in `get_items': undefined method `url' for nil:NilClass (NoMethodError)

如果有人能解释一下到底哪里出了问题,我真的需要一些帮助来让这段代码运行。

我试着在第17行下面加一个 "break if input == "exit"",结果出现了 "无效中断 "的错误,所以我想可以把它加到最下面。

https://github.com/codyalvarez/starwars-api
ruby api command-line-interface
1个回答
1
投票

问题从以下几个方面开始

input = gets.chomp.to_i

你把输入的文本转换成一个整数。如果用户输入'exit',则会出现 to_i 方法将其转换为0。之后,你将基于 (input-1). 因此 退出-作为最后的比较,你问的是 -1 == 'exit',当然这是一个例外。

如果你想保持这种IMO怪异的处理用户输入的方式,你必须检查是否有 -1 来找出用户是否输入了一个非整数值。当然,这意味着你的程序也会退出,如果用户输入了类似于 你好,梅兰妮阿姨!.

© www.soinside.com 2019 - 2024. All rights reserved.