2016-08-10 3 views
1

때로는 async/await 구문을 사용한 후에 프로그램이 더 이상 제대로 작동하지 않습니다. 그러나 예외는 없습니다. 예를 들어 : 나는 try/except 구문 예외를 사용하는 경우asnycio의 예외가 늦거나 전혀 나타나지 않는 이유는 무엇입니까?

async def my_func(self): 
    async with self.engine() as conn: 
     print('step1') # step1 shows in console 
     await conn.exceute("INSERT INTO bla-bla") 
     print('step2') # I can't watch 'step2', and no any exceptions caughted to console 

는 그러나 사로 잡았 할 수 있습니다

async def my_func(self): 
    async with self.engine() as conn: 
     print('step1') # step1 shows in console 
     try: 
      await conn.exceute("INSERT INTO bla-bla") 
     except Exception as e: 
      print_exc() # only by this way I can see whats wrong 
     print('step2') 

겠어요 - 잡기없이 즉시 예외를 볼 수 있습니까? 아니면 단계 만 사용하고 모두 디버깅 할 수 있습니까?

+1

환경 변수 PYTHONASYNCIODEBUG = 1을 설정하여 시작하십시오. – wim

+0

@wim은 도움이되지 않습니다 (오류는 계속 표시되지 않음). 하지만 이제는 콘솔에서 많은 디버그 추적을보고 (오류가 아닌), 눈을 부시게됩니다. – Broly

+2

설명서에 따르면, 도움이됩니다. https://docs.python.org/3/library/asyncio-dev.html#detect-exceptions-never-consumed – Petr

답변

1

예외가 발생하고 스택이 풀립니다.

진짜 질문은 : 당신의 코 루틴을 실행하는 데 당신은 무엇을 사용합니까?

loop.run_until_complete(my_func())은 예상대로 예외를 처리합니다. 다른 사용 시나리오는 다를 수 있습니다.

+0

'loop.create_task (my_func())'를 사용했습니다 아마도 'try/except'를 사용해야합니다. ''my_func()'안에? – Broly

+1

생성 된 작업에 대해서는 ** 불과 잊어 ** 기술을 사용하면 안됩니다. 'result = await loop.create_task (my_func())'를 사용하십시오. 작업을 기다리는 경우 예외가 발생합니다. 작업 생성과 결과 대기를 분리 할 수 ​​있지만 작업 결과를 어딘가에 요청해야합니다. –

+0

속성에'create_task'를 사용했습니다. 속성에는'__aget__'과'__aset__'이 없으므로'await'을 사용할 수 없습니다. 또한 변경 후 DB에 쓰려면'list' 및'dict' 메소드의 클래스 상속자에서'create_task'를 사용했습니다. 이 좋은 습관인가? 아니면 더 좋은 방법이 있을까요? 사실 비동기 설명자와 할당이 부족하여 채울 수 있습니다. – Broly