2009-04-29 30 views
5

Trong Python là có bất kỳ ngôn ngữ (hoặc thông dịch viên) tính năng để buộc các thông dịch viên python luôn luôn nâng cao ngoại lệ ngay cả khi mã ngoại lệ vi phạm là bên trong một khối thử/trừ?Python - Có thể buộc tăng ngoại lệ bất kể thử/ngoại trừ khối không?

Tôi vừa thừa hưởng một codebase lớn hơn và cũ được viết bằng python, có mục đích là giao tiếp với một số phần cứng được thiết kế tùy chỉnh mà chúng tôi cũng đã phát triển. Nhiều sai sót thông tin liên lạc và timeout đang được đeo mặt nạ/nhỡ do mô hình (giản thể) mã sau đây:

try: 
    serialport.write(MSG) 
except: 
    some_logging_function_mostly_not_working_that_might_be_here_or_not() 
    #or just: 
    #pass 

Để tránh kịch bản điển hình của "chỉ viết lại toàn bộ sự việc từ đầu", tôi hiện đang cố gắng khắc phục tất cả các lỗi ngoại lệ/lỗi thời gian chờ. Tôi đang làm điều này bằng cách vô hiệu hóa bằng tay tất cả các mã xử lý ngoại lệ, mỗi lần một.

+1

Tôi không thể nói chuyện với python, vì tôi chưa bao giờ sử dụng nó (vì vậy tại sao tôi trả lời dưới dạng nhận xét thay vì câu trả lời thực), nhưng hầu hết các trình gỡ rối đều có tùy chọn "phá vỡ tất cả ngoại lệ". Điều này cũng có thể được gọi là "ngoại lệ cơ hội đầu tiên". Nó sẽ cho phép mã của bạn không thay đổi, nhưng xử lý mọi "ném" như một điểm ngắt. Kiểm tra xem trình gỡ rối của bạn có tính năng đó hay không. – rmeador

Trả lời

11

Khối "tất cả ngoại lệ" except: là một điều đáng chú ý và chỉ đơn giản là được tìm thấy và thay thế bằng hợp lý ngoại trừ việc xử lý.

Trong trường hợp này grep là bạn của bạn. Một IDE tốt có thể giúp các công việc khó chịu này có thể quản lý được.

Nhưng không có tùy chọn "bỏ qua mã được viết" bằng Python.

+1

+1 "bỏ qua đoạn mã được viết" :-) –

+1

pyparsing là một công cụ hữu ích để thực hiện chuyển đổi mã. –

-2

Bạn có thể sử dụng nhiều trình xử lý ngoại lệ để xử lý nhiều ngoại lệ.

try: 
    serialport.write(MSG) 
except Handler1: 
    some_logging_function_mostly_not_working_that_might_be_here_or_not() 
    #or just: 
    #pass 
except Handler2: 
    some_logging_function_mostly_not_working_that_might_be_here_or_not2() 
    #or just: 
    #pass 
3

Không, không thực sự. Đặt cược tốt nhất của bạn là thay đổi mã thành một cái gì đó giống như thế này:

try: 
    serialport.write(MSG) 
except: 
    some_logging_function_mostly_not_working_that_might_be_here_or_not() 
    raise 

Điều này sẽ làm cho nó tăng lại ngoại lệ chính xác. Điều chính mà bạn cần hiểu là nếu có một cách để làm cho tất cả các ngoại lệ thoát khỏi hệ thống, bạn sẽ không thể sử dụng vòng lặp for (các trình vòng lặp tăng một ngoại lệ StopIteration).

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