Làm cách nào để phát hiện 'Cảnh báo' GDAL / OGR?


8
  • Khi tôi chạy tập lệnh bó bằng chương trình GDAL / OGR , tôi có thể phát hiện nếu có lỗi xảy ra bằng cách kiểm tra ERRORLEVELgiá trị 1.

  • Khi sử dụng GDAL / OGR trong python hoặc .NET , tôi gặp ngoại lệ khi xảy ra lỗi.

Câu hỏi:
Làm thế nào để tôi phát hiện nếu a Warningđược ban hành trong khi thực hiện?


Tại sao?
Mặc dù một quá trình có thể thực thi đến cùng bất chấp cảnh báo, đầu ra có thể bị hỏng đối với dữ liệu tôi mong đợi. Bạn có thể lập luận rằng tôi nên kiểm tra các lỗi này, nhưng vì tôi có quyền kiểm soát toàn bộ quá trình, tôi muốn có thể dừng lại khi cảnh báo được đưa ra.


Bạn có thể sửa đổi hành vi xử lý lỗi ở cấp độ C (xem gdal.org/cpl__error_8h.html ), bao gồm chuyển cảnh báo thành lỗi và đặt trình xử lý lỗi. Tôi không thấy bất cứ điều gì sẽ phơi bày điều đó với các API không phải C.
BradHards

1
Tôi nghĩ rằng câu hỏi này được trang bị nhiều hơn để được hỏi tại stackoverflow.com ?
biệt danh

@BradHards : Tôi thà không đi sâu vào mã C và tự biên dịch nội dung.
Châu

1
@nickves : Tôi đã đặt câu hỏi ở đây vì tôi hy vọng những người sử dụng GDAL / OGR sẽ sử dụng diễn đàn này.
Châu

Câu trả lời:


3

Nếu sử dụng GDAL 1.10+, các ràng buộc python cho phép bạn chỉ định một python có thể gọi là trình xử lý lỗi . Tuy nhiên, các trình xử lý lỗi này dường như được gọi trong một luồng riêng biệt và mọi trường hợp ngoại lệ được nêu ra không lan truyền trở lại luồng chính . Vì vậy, một cái gì đó như thế này sẽ không hoạt động:

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()

Nhưng bạn có thể làm một cái gì đó như thế này:

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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.