Ado1phu5 2023-12-20 10:35 采纳率: 0%
浏览 9

有点死循环的try..except

问个问题哦大佬们。如下程序,要实现的功能就是测试ip地址的网站状态码然后将结果存储到数据库里。然后直接想着直接request.get效率有点低就加了个并发。这边问题就是我没办法把所有的结果都正确的导入到数据库。如果运行如下示例,就会报response是局部变量这种“UnboundLocalError: local variable 'response' referenced before assignment”。如果将insert语句加到try里面只能导入存在网站状态码的,如果同时加到try和except里面,except里面也会出现出现unboundlocalerror的报错。把获取response值的语句放到try外面更不行了,直接拦截不住异常直接结束程序。学艺不精还请路过大佬指教啊!


```python
 # 遍历文本文件中的每一行并测试 URL
        count = 0
        count_200 = 0
        count_404 = 0
        count_403 = 0
        count_502 = 0
        count_error = 0
        count_else = 0
        with concurrent.futures.ThreadPoolExecutor() as executor:
            futures = []
            for row in reader:
                ipv6_address = row[0]
                url = 'https://[' + ip_address + ']/'  # 使用正确的列名
                futures.append(executor.submit(requests.get , url , headers=headers , verify=False , timeout=3))
                count += 1

            for future in concurrent.futures.as_completed(futures):
                try:
                    response = future.result()
                    status_code = response.status_code
                    if status_code == 200:
                        count_200 += 1
                    elif status_code == 404:
                        count_404 += 1
                    elif status_code == 403:
                        count_403 += 1
                    elif status_code == 502:
                        count_502 += 1
                    else:
                        count_else += 1
                      
                except Exception as e:
                    status_code = -1
                    count_error += 1
                insert_query = f"INSERT INTO {table_name} (id, ip_address, status_code) VALUES (NULL, '{response.url}', {status_code})"
                cursor.execute(insert_query)
                
        # 提交更改并关闭连接
        cnx.commit()
        cursor.close()
        cnx.close()

```

  • 写回答

3条回答 默认 最新

  • 编程乐学 2023-12-20 10:40
    关注

    你可以在 except 块中设置一个默认值给 response 变量,以确保在异常情况下也有一个值可以使用。例如,你可以在 except 块中添加以下代码:

    response = None
    
    

    然后在插入语句中使用 response 变量时,先检查它是否为 None,如果是,则使用一个默认值。例如:

    insert_query = f"INSERT INTO {table_name} (id, ip_address, status_code) VALUES (NULL, '{response.url if response else 'N/A'}', {status_code if response else -1})"
    
    
    

    这样,无论是否出现异常,都能正常插入数据到数据库中。如果出现异常,response 变量将保持为 None,并将使用默认值

    评论

报告相同问题?

问题事件

  • 创建了问题 12月20日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境