【问题标题】:How to continue after except除了之后如何继续
【发布时间】:2019-05-05 19:19:26
【问题描述】:

我有这个将主机名转换为 IP 的脚本。然而,当它发现一个不存在的,它就会停止。即使出现异常,我也希望它继续,但是我找不到我的方式。

#Script to resolve hostname to IP. Needs improving.
import socket

def file_len(fname):
    with open(fname) as f:
        for i, l in enumerate(f):
            pass
    return i + 1

def resolve_ip():

with open("test.txt", "r") as ins:
    try:
        for line in ins:
            print(socket.gethostbyname(line.strip()))

    except Exception:
            print(line)


resolve_ip()

主要是打印所有 IP,直到出现错误。异常转换左行后如何继续?

谢谢

【问题讨论】:

  • 你还没有展示驱动这个的外部循环。你能不能把for line in ins:从try/except中提升出来?
  • 目前你有一个全有或全无的设置。除非文件实际上可能是空的,否则 for line in ins: 看起来不会失败,只有 socket.gethostbyname(line.strip()) 所以不清楚为什么你在 try 块内有循环,除非我误解了

标签: python try-catch except


【解决方案1】:
#Script to resolve hostname to IP. Needs improving.
import socket

def resolve_ip(file_name):
    with open(file_name, "r") as ins:
        for line in ins:
            line = line.strip()
            try:
                print(socket.gethostbyname(line))
            except socket.gaierror:
                print(line)

resolve_ip('test.txt')

请注意,如果文件为空,您的其他函数会引发异常。此外,您不需要遍历文件。使用文件对象的readlines() 方法读取列表中的所有行,然后返回此列表的len

【讨论】:

  • 对文件进行迭代通常比readlines() 好,因为它不会一次将全部内容加载到内存中。使用range(len()),我认为这是你所建议的,会少得多Pythonic。
  • @roganjosh 我同意迭代文件比在内存中读取文件更好。我建议readlines() 给定 OP 目标以获取行数。如果他们进行迭代,他们需要考虑空文件的可能性并相应地修改他们的代码。我没有建议range(len())
猜你喜欢
  • 1970-01-01
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多