首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在异常/错误后继续在Python中执行程序

如何在异常/错误后继续在Python中执行程序
EN

Stack Overflow用户
提问于 2020-12-21 05:46:41
回答 1查看 196关注 0票数 0

我是python编程的老师。我给我的学生布置了一些家庭作业,现在我必须批改它们。家庭作业以函数的形式提交。这样,我就可以使用importlib中的导入模块来导入每个学生编写的函数。我把所有的测试都放在一个try/except块中,但是当一个学生做错了什么(例如,要求用户输入、错误缩进等)。主测试程序挂起或停止。

有没有一种方法可以执行所有的测试,而不会因为学生的错误而使主程序停止?

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-12-21 12:33:35

Python在两次遍历中查找错误。

第一遍在执行一行代码之前很久就捕获了错误。

第二遍只会在运行时发现错误。

try-except块不会捕获不正确的缩进。

代码语言:javascript
运行
复制
try:
    x = 5
    for x in range(0, 9):
    y = 22
    if y > 4:
    z = 6
except:
    pass

你会得到类似这样的结果:

代码语言:javascript
运行
复制
File "D:/python_sandbox/sdfgsdfgdf.py", line 6
    y = 22
    ^
IndentationError: expected an indented block

您可以使用exec函数来执行存储在字符串中的代码。

代码语言:javascript
运行
复制
with open("test_file.py", mode='r') as student_file:
    lines = student_file.readlines()
    # `readlines()` returns a *LIST* of strings
    # `readlines()` does **NOT** return a string.
    big_string = "\n".join(lines)
    try:
        exec(big_string)
    except BaseException as exc:
        print(type(exc), exc)

如果使用exec,程序将不会在出现缩进错误时挂起。

exec是非常危险的。

学生可以使用以下代码删除一个或多个硬盘上的所有文件:

代码语言:javascript
运行
复制
import os
import shutil
import pathlib

cwd_string = os.getcwd()
cwd_path = pathlib.Path(cwd_string)
cwd_root = cwd_path.parts[0]

def keep_going(*args):
    # keep_going(function, path, excinfo)
    args = list(args)
    for idx, arg in enumerate(args):
        args[idx] = repr(str(arg))
    spacer = "\n" + 80*"#" + "\n"
    spacer.join(args)

shutil.rmtree(cwd_root, ignore_errors=True, onerror=keep_going)

您要做的就是所谓的“单元测试

有一个用于单元测试python library

理想情况下,您将使用“测试环境”来防止损坏您自己的计算机。

我建议你买一台你能在网上找到的最便宜的二手笔记本电脑(eBay等)。确保有一张笔记本电脑工作的照片(没有电池)。也许可以让笔记本电脑一直插在电源上。

使用廉价的笔记本电脑来测试学生的代码。

您可以覆盖内置的input函数。

它可以防止程序挂起。

编写良好的测试环境还可以轻松地重定向命令行输入。

代码语言:javascript
运行
复制
def input(*args, **kwargs):
    return str(4)

def get_user_input(tipe):
    prompt = "please type in a(n) " + str(tipe) + ":\n"
    while True:
        ugly_user_input = input(prompt)
        pretty_user_input = str(ugly_user_input).strip()
        try:
            ihnt = int(pretty_user_input)
            return ihnt
        except BaseException as exc:
            print(type(exc))
            print("that's not a " + str(tipe))

get_user_input(int)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65385116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档