2012-09-11 29 views
10

tôi có mã này python:Python khối try không bắt os.system ngoại lệ

import os 
try: 
    os.system('wrongcommand') 
except: 
    print("command does not work") 

Các bản in mã:

wrongcommand: command not found 

Thay vì command does not work. Có ai biết tại sao nó không in thông báo lỗi của tôi?

Trả lời

18

Nếu bạn muốn có một ngoại lệ ném khi lệnh không tồn tại, bạn nên sử dụng subprocess:

import subprocess 
try: 
    subprocess.call(['wrongcommand']) 
except OSError: 
    print ('wrongcommand does not exist') 

Hãy đến với suy nghĩ của nó, có lẽ bạn nên sử dụng subprocess thay vì os.system anyway ...

+0

cảm ơn, đây chỉ là những gì tôi cần. – Cinder

1

wrongcommand: command not found là đầu ra của vỏ os.system đang sử dụng để gọi lệnh. os.system không ném một ngoại lệ

EDIT: thay đổi nội dung bởi phần sao chép và dán các bình luận mgilson của

+0

cảm ơn, nhưng làm thế nào để bạn bắt nó trong python? là nó thậm chí có thể? – Cinder

+1

Có, nhưng không sử dụng 'os.system()'. Đây là một lý do tại sao bạn nên sử dụng mô đun 'subprocess', như được nêu trong câu trả lời của @ mgilson. –

+0

Cụ thể hơn, 'sai lệnh: lệnh không tìm thấy' là đầu ra của * shell * mà' os.system' đang sử dụng để gọi lệnh.(một trình bao khác với một 'PATH' khác có thể tìm thấy lệnh). – mgilson

3

Có hai vấn đề trong đoạn mã của bạn. Trước hết, không bao giờ chỉ làm try: ... except:, luôn luôn cụ thể về ngoại lệ bạn muốn xử lý. Nếu không, chương trình của bạn chỉ đơn giản là nuốt bất kỳ loại lỗi nào, cũng như những lỗi mà bạn không mong đợi. Trong hầu hết các trường hợp, điều này sẽ dẫn đến hành vi bất ngờ tại một số điểm khác trong thời gian chạy.

Hơn nữa, os.system() cuộc gọi hầu hết thời gian sẽ được thay thế bằng các đối tác của chúng từ mô-đun subprocess.

Để xem điều gì xảy ra, hãy thoát khỏi khối try/except và thực sự xem xét truy xuất/ngoại lệ. Như những người khác đã chỉ ra, bạn sẽ nhận thấy rằng không có ngoại lệ trong trường hợp của bạn đó là lý do tại sao chuỗi tùy chỉnh của bạn không được in.

Tóm lại: suy nghĩ về những ngoại lệ cụ thể có thể xảy ra trong khối mã của bạn. Hãy suy nghĩ kỹ về điều bạn mong đợi xảy ra vì những lý do nhất định và xử lý chúng một cách thích hợp. Không xử lý những người mà bạn không mong đợi.

9

Vì os.system() chỉ ra một sự thất bại thông qua mã lối ra của phương pháp

  • giá trị trả về = 0 -> tất cả mọi thứ ok
  • giá trị trả về = 0 -> một số lỗi

Mã thoát của lệnh được gọi trực tiếp được chuyển lại cho Python.

Có tài liệu cho bạn biết rằng os.system() sẽ làm tăng ngoại lệ trong trường hợp lỗi. os.system() chỉ cần gọi hàm underlaying system() của hệ điều hành và trả về giá trị trả về của nó.

Vui lòng đọc tài liệu os.system() cẩn thận.

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