2012-10-25 15 views
9

Bất cứ ai có thể cho tôi biết lý do thực sự đằng sau cảnh báo tôi nhận được trong phần mềm trung gian Django này và làm cách nào để giải quyết vấn đề này?Ngừng sử dụngWarning: BaseException.message đã không còn được dùng như ngoại lệ Python 2.6.__ class__, exception.message,

Tôi nhận được tin nhắn này "DeprecationWarning: BaseException.message đã bị phản đối như của Python 2.6 ngoại lệ lớp, exception.message,."

class GeneralMiddleware(object): 
    def process_exception(self, request, exception): 
     if exception.__class__ is SandboxError: 
      # someone is trying to access a sandbox that he has no 
      # permission to 
      return HttpResponseRedirect("/notpermitted/") 

     exc_type, value, tb = sys.exc_info() 
     data = traceback.format_tb(
        tb, None) + traceback.format_exception_only(
        exc_type, value) 
     msg = (
      "Failure when calling method:\n" 
      u"URL:'%s'\nMethod:'%s'\nException Type:'%s'\n" 
      u"Error Message '%s'\nFull Message:\n%s" 
      % (request.get_full_path(), request.method, 
       exception.__class__, exception.message, 
+0

Hãy thử 'isinstance (ngoại lệ, SandboxError)' thay vì 'ngoại lệ .__ class__ là SandboxError'. – Blender

+0

Nó không làm việc cho tôi máy xay sinh tố ... nhờ phản ứng nhanh của bạn. Trên thực tế tôi nhận được cảnh báo về ngoại lệ .__ class__, exception.message dòng này. – PythonDev

Trả lời

24

Nếu tôi nhớ không lầm thì khi Python chuyển sang cú pháp tăng mới trong 2.5, họ đã thoát khỏi những message thành viên ủng hộ (?) của một bộ phận args tuple. Để tương thích ngược, BaseException.message có hiệu quả giống như BaseException.args[0] if BaseException.args else None, nhưng bạn không nên sử dụng tính năng này trong mã mới.

Vì vậy, thay đổi message hoặc là args (nếu bạn muốn tất cả args) hoặc args[0] (hoặc, nếu bạn đang lo lắng có thể không có args, phiên bản fancier bảo vệ chống lại ()), tùy thuộc vào bạn muốn.

Lý do cho thay đổi này là với ngoại lệ kiểu mới, không có phép thuật nào cho raise hoặc except nữa; bạn chỉ cần gọi hàm tạo của lớp ngoại lệ trong câu lệnh raise và bắt ngoại lệ trong một biến trong câu lệnh except. Vì vậy:

try: 
    raise MyException('Out of cheese error', 42) 
except Exception as x: 
    print x.args 

Điều này sẽ in ('Out of cheese error', 42). Nếu bạn chỉ có print x.message, bạn chỉ nhận được 'Out of cheese error'. Vì vậy, các lớp con Ngoại lệ được sử dụng để làm những điều kỳ lạ để mang theo một mã lỗi như một thành viên riêng biệt, vv, có thể được đơn giản hóa; trên thực tế, toàn bộ vấn đề được đưa ra cho điều này:

class BaseException(object): 
    def __init__(self, *args): 
    self.args = args 
0

là lớp SandboxError bạn thừa hưởng từ Exception lớp học? Nếu không, bạn sẽ nhận được thông báo này. Lý do được mô tả trong PEP352.

Trong mã, ngoại trừ của bạn cần được xác định như thế này:

class SandboxException(Exception): 
    .... 
+0

Có tôi đã thừa hưởng lớp SandboxError từ Ngoại lệ. lớp SandboxError (Ngoại lệ): vượt qua – PythonDev

Các vấn đề liên quan