Respostas:
De exemplos ArcPy , parece que sys.exit()
é a maneira correta de encerrar um script cedo.
A documentação do Python observa que sys.exit()
:
é implementado levantando a exceção SystemExit, para que as ações de limpeza especificadas por finalmente cláusulas das instruções try sejam respeitadas e é possível interceptar a tentativa de saída em um nível externo.
A maneira mais fácil de lidar com isso é agrupar seu script em um manipulador de exceções:
import sys
import arcpy
try:
#do stuff
sys.exit(0)
except SystemExit:
pass
No entanto, isso não é particularmente elegante e requer uma reestruturação de todo o seu projeto, sem mencionar outro nível de indentação. Além disso, na improvável situação em que outra parte do seu código gera uma SystemExit
exceção, você nunca saberia sobre isso ... Outra solução deselegante, mas talvez preferível, é agrupar chamadas para sys.exit () em outra função:
import sys
import arcpy
def finish(arg=None):
try:
sys.exit(arg)
except SystemExit:
pass
#do stuff
finish()
Agora você pode chamar finish()
, finish(1)
ou finish('Error message')
apenas como você espera ser capaz de chamar sys.exit ().
Obviamente, podemos querer usar nossa abordagem de exceção de comer em outras circunstâncias, e como esse é o Python, podemos generalizar e criar um decorador útil e polivalente:
import sys
import arcpy
def eat_exception(fn, exception):
def safe(*v, **k):
try:
fn(*v, **k)
except exception:
pass
return safe
finish = eat_exception(sys.exit, SystemExit)
#do stuff
finish()