GDAL / OGRの「警告」を検出するには?


8
  • GDAL / OGRプログラムを使用してバッチスクリプトを実行すると、値1を確認することでエラーが発生したかどうかを検出できます。ERRORLEVEL

  • Pythonまたは.NETでGDAL / OGRを使用すると、エラーが発生すると例外が発生します。

質問:実行中にが発行された
かどうかをどのように検出しWarningますか?


どうして?
警告が出てもプロセスが最後まで実行される可能性がありますが、予期したデータに関して出力が破損している可能性があります。私はこれらの破損をチェックするべきだと主張するかもしれませんが、私はプロセス全体を制御しているので、警告が出されたときに停止できるようにしたいと思います。


警告をエラーに変換したり、エラーハンドラーを設定したりするなど、Cレベルでエラー処理動作を変更できます(gdal.org/cpl__error_8h.htmlを参照)。ただし、それを非C APIに公開するものは何もありません。
BradHards

1
この質問は、stackoverflow.comで質問するのにより適していると思いますか?
nickves

@BradHards:私はむしろCコードに飛び込んで自分のものをコンパイルしたくない。
Chau

1
@nickves:GDAL / OGRを使用している人々がこのフォーラムを使用することを期待しているので、ここで質問をしました。
Chau

回答:


3

GDAL 1.10+を使用している場合、Pythonバインディングにより、Python呼び出し可能オブジェクトをエラーハンドラーとして指定できます。ただし、これらのエラーハンドラーは別のスレッドで呼び出されているように見え、発生した例外はメインスレッドに伝播されません。したがって、このようなものは機能しません:

from osgeo import gdal

def error_handler(err_level, err_no, err_msg):

    if err_class >= gdal.CE_Warning:
        raise RuntimeError(err_level, err_no, err_msg) #this exception does not propagate back to main thread!
    else: print err_msg

if __name__=='__main__':

    #Test custom error handler
    gdal.PushErrorHandler(error_handler)
    gdal.Error(gdal.CE_Warning,2,'test warning message')
    gdal.PopErrorHandler()

しかし、あなたはこのようなことをすることができます:

from osgeo import gdal

class GdalErrorHandler(object):
    def __init__(self):
        self.err_level=gdal.CE_None
        self.err_no=0
        self.err_msg=''

    def handler(self, err_level, err_no, err_msg):
        self.err_level=err_level
        self.err_no=err_no
        self.err_msg=err_msg

if __name__=='__main__':

    err=GdalErrorHandler()
    handler=err.handler # Note don't pass class method directly or python segfaults
                        # due to a reference counting bug 
                        # http://trac.osgeo.org/gdal/ticket/5186#comment:4

    gdal.PushErrorHandler(handler)
    gdal.UseExceptions() #Exceptions will get raised on anything >= gdal.CE_Failure

    try:
        gdal.Error(gdal.CE_Warning,1,'gdal.CE_Warning warning')
    except Exception as e:
        print 'Operation raised an exception'
        print e
    else:
        print 'No exception'
        if err.err_level >= gdal.CE_Warning:
            raise RuntimeError(err.err_level, err.err_no, err.err_msg)
    finally:
        print err.err_level, err.err_no, err.err_msg
        gdal.PopErrorHandler()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.