如何在Julia中发生异常后继续从readline(STDIN)获取输入?

如何在Julia中发生异常后继续从readline(STDIN)获取输入?,julia,Julia,我试图通过编写经典的猜数字游戏来学习Julia: function main() secret_number = rand(1:10) println("Guess my number! ") guess_number = try int(chomp(readline(STDIN))) catch ex println("Invalid number. Please enter a number:") #

我试图通过编写经典的猜数字游戏来学习Julia:

function main()
    secret_number = rand(1:10)
    println("Guess my number! ")

    guess_number =

    try
        int(chomp(readline(STDIN)))
    catch ex
        println("Invalid number. Please enter a number:")
        # how to continue here?
        int(chomp(readline(STDIN)))
    end

    while(guess_number != secret_number)
        validate(guess_number, secret_number)
        guess_number = int(chomp(readline(STDIN)))
    end
        println("You win!")
    end

    function validate(g_num,s_num)
        if g_num < s_num 
            println("Too small!")
        elseif g_num > s_num
            println("Too big!") 
        else     
            println("Equal")
        end
    end
函数main()
秘密号码=兰特(1:10)
println(“猜猜我的号码!”)
猜猜你的号码=
尝试
int(chomp(readline(STDIN)))
缉捕犯
println(“无效数字。请输入一个数字:”)
#如何在这里继续?
int(chomp(readline(STDIN)))
结束
while(猜测号码!=秘密号码)
验证(猜测号码、秘密号码)
猜数=int(chomp(readline(STDIN)))
结束
println(“你赢了!”)
结束
函数验证(g_num,s_num)
如果g_nums_num
println(“太大了!”)
其他的
println(“相等”)
结束
结束

此程序只能处理一次输入异常(即,如果用户输入不是数字)。用户第二次输入无效数字时,程序停止。如何在Julia中解析
int

验证循环中的第二个循环,以验证
guess\u number
实际上是一个数字,可以解决此问题,例如:

function main()
    secret_number = rand(1:10)
    println("Guess my number! ")
    guess_number = 0
    while(guess_number != secret_number)
        valid = false
        response = ""
        while (!valid)
            guess_number =
            try
                valid = true
                response = chomp(readline(STDIN))
                int(response)
            catch ex
                if (response == "q")
                    return
                end
                println("Invalid number. Please enter a number:")
                valid = false
            end
        end
        validate(guess_number, secret_number)
    end
    println("You win!")
end


function validate(g_num,s_num)
    if g_num < s_num 
        println("Too small!")
    elseif g_num > s_num
        println("Too big!") 
    else     
        println("Equal")
    end
end

main()
函数main()
秘密号码=兰特(1:10)
println(“猜猜我的号码!”)
猜一猜数字=0
while(猜测号码!=秘密号码)
有效=错误
response=“”
while(!valid)
猜猜你的号码=
尝试
有效=真
响应=chomp(读线(标准输入))
内部助理(回应)
缉捕犯
如果(响应=“q”)
返回
结束
println(“无效数字。请输入一个数字:”)
有效=错误
结束
结束
验证(猜测号码、秘密号码)
结束
println(“你赢了!”)
结束
函数验证(g_num,s_num)
如果g_nums_num
println(“太大了!”)
其他的
println(“相等”)
结束
结束
main()
这种方法也应用了这一原理,只获取原始代码中一行而不是两行的输入

(编辑)


根据评论中的要求,我还提供了一种退出
main()
函数的方法,在要求输入数字时输入“q”

非常感谢您的解释,特别是
DRY
原理的应用。
while(!valid)
在这里真的很耀眼!我想你必须高度重视编程和生活中最好的方法。我可以问一下你最喜欢的编程书是什么吗?有没有办法不退出julia repl而退出猜谜游戏
Ctrl-d
Ctrl-c,Ctrl-c
在猜数字时不起作用。很高兴提供帮助。我对答案进行了编辑,提出了一种方法,可以在不退出Julia REPL的情况下退出
main()
函数。为书籍提出建议超出了堆栈溢出(基于观点)的范围,但我个人的观点是Hunt和Thomas的“务实程序员”是DRY原则的一个很好的来源(这是一个比不重复代码行更深的概念)。Kernighan和Pike的“编程实践”也很出色。正如所料,
q
退出了该程序。我在网上搜索,发现
ctrl-c
应该退出程序执行,但它不起作用,人们对此抱怨很多。我想在以后的版本中,Julia将能够通过
ctrl-c
处理中断。感谢您的
q
选项-它解决了问题。你提到的那些书很有名气,我已经把它列入了我的阅读清单。再次感谢。你打了几个错字,我帮你改正了。@BrianTompsett谢谢你。下次我会注意打字的。