2014-07-13 21 views
0

假設我有一個連續運行的程序,正在等待具有標準輸入的程序的順序。一直等待訂單的方法稱爲「運行」。如何捕捉錯誤並寫入strerr讓程序中斷

http://oi58.tinypic.com/4fx1tu.jpg

正如你看到的,運行()獲取一定的順序時,他們通過以某些功能。

當我運行該程序,每次我給這可能會導致錯誤的命令(比如:索引錯誤),它打破和關閉(顯然)

我決定嘗試捕獲錯誤與try/except

def a(order): 
    try: 
     <some algorithm> 
     return something 
    except Exception, error: 
     stderr.write(error) 
     stderr.flush() 
def b(order): 
    try: 
     <some algorithm> 
     return something 
    except Exception, error: 
     stderr.write(error) 
     stderr.flush() 
def run(order) 
    while stdin.notclosed: 
     try: 
      read stdin 
      if stdin==specific order : 
       x=a(stdin order) 
      else: 
       x=b(stdin order) 
     except Exception,error: 
      stderr.write(error) 
      stderr.flush() 
run() 

但是,看起來命令的程序看不到錯誤。從我的分析師看來,只有在讀取訂單的程序結束後,才下達訂單的程序開始讀取stderr。但是,由於try/catch,程序永遠不會結束。無論如何,要抓住錯誤,寫下它,然後結束它。 (錯誤可能來自任何函數)

PS:假設您不能修改或讀取發出命令的程序。 (這是競爭,我說這個的原因是因爲當我訪問stderr時,它是空的。)

+0

要捕獲錯誤並停止執行或你想捕捉它的功能造成的錯誤,並停止執行。 – Anurag

+0

你可以運行這個程序每個訂單一次(擺脫'while'),因此給你的不可觸摸的父母有機會每次讀'stderr'嗎?你的父母是否閱讀'stdout',或者是否與'stderr'相同?如果不是,它在觀看文件嗎?它如何期望被通知錯誤? – slezica

+0

您可以用'raise'語句結束'except'套件來重新引發最後一個活動的異常。 – martineau

回答

0

不確定這是否滿足您的需要,但是您可以重新引發通過添加如下所示,在except塊的末尾填入空的raise聲明。這將導致異常由下一個更高級的try/except塊(如果有)處理,或者如果沒有則終止該程序。

例子:

def a(order): 
    try: 
     <some algorithm> 
     return something 
    except Exception, error: 
     stderr.write(error) 
     stderr.flush() 
     raise # re-raise exception 
0
def a(order): 
     try: 
      <some algorithm> 
      return something 
     except Exception, error: 
      import traceback 
      trace = traceback.format_exc() 
      return trace 

    def b(order): 
     try: 
      <some algorithm> 
      return something 
     except Exception, error: 
      import traceback 
      trace = traceback.format_exc() 
      return trace 

    def run(order) 
     while stdin.notclosed: 
      try: 
       read stdin 
       if stdin==specific order : 
        x=a(stdin order) 
       else: 
        x=b(stdin order) 
       #check if x == trace then sys.exit() 
      except Exception,error: 
       stderr.write(error) 
       stderr.flush() 
    run()