【问题标题】:Handling exception (when no connection) in pyodbc在 pyodbc 中处理异常(无连接时)
【发布时间】:2015-12-15 20:46:45
【问题描述】:

我试图在连接到数据库并且没有连接时捕获异常,但我总是在 pyodbc.connect(connstr) 处冻结。我尝试了来自documentation 的所有错误,只尝试了“异常除外”,但我看到我的程序在无法连接到数据库时冻结并且不检查除部分。 (冻结是由我故意断开与数据库的连接引起的,并且程序在我硬重置之前什么都不做(Windows“无应答”):

    import pyodbc
    connstr=('DRIVER={SQL Server Native Client 11.0};Server="server_ip";port=1433;Network Library=DBMSSOCN;Database="name";uid="uid";pwd="pwd";')
    try:
        print("I'm here - no problem")
        conn=pyodbc.connect(connstr)
        print("of course not here")
    except ...no_matter_what_I_write_here... :
        print("but never there too") 

【问题讨论】:

  • 是长时间超时导致的卡顿吗?请显示输出...
  • 没有输出,没有错误,什么都没有
  • 好的,然后查看pyodbc.connect 的文档以查看错误情况下的行为以及是否可以设置任何参数/全局配置文件来更改超时限制

标签: python python-3.x exception pyodbc


【解决方案1】:

太简单了(感谢 Pynchia 的建议):

try:
    conn=pyodbc.connect(connstr, timeout=5)
except pyodbc.Error as err:
    print("Couldn't connect")

【讨论】:

    【解决方案2】:

    假设您没有在线程上连接。因为信号不会在非主线程中工作。

    import signal
    from contextlib import contextmanager
    
     class TimeoutError(Exception): pass
    
     @contextmanager
     def time_limit(seconds):
         def signal_handler(signum, frame):
             raise TimeoutError("Time out")
         signal.signal(signal.SIGALRM, signal_handler)
         signal.alarm(seconds)
         try:
              yield
         finally:
              signal.alarm(0)
    
    
     try:
         with time_limit(10):
              conn=pyodbc.connect(connstr)     
     except TimeoutError as e:
            print "couldn't connect for long time"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 2015-02-06
      • 1970-01-01
      • 2016-01-07
      • 1970-01-01
      相关资源
      最近更新 更多