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日

悬赏问题

  • ¥15 gojs 点击按钮node的position位置进行改变,再次点击回到原来的位置
  • ¥15 计算决策面并仿真附上结果
  • ¥20 halcon 图像拼接
  • ¥15 webstorm上开发的vue3+vite5+typeScript打包时报错
  • ¥15 vue使用gojs,需求在link中的虚线上添加方向箭头
  • ¥15 CSS通配符清除内外边距为什么可以覆盖默认样式?
  • ¥15 SPSS分类模型实训题步骤
  • ¥100 求ASMedia ASM1184e & ASM1187e 芯片datasheet/规格书
  • ¥15 求解决扩散模型代码问题
  • ¥15 工创大赛太阳能电动车项目零基础要学什么