Cách tạo một thông báo thoát


208

Có một cuộc gọi chức năng một dòng mà thoát khỏi chương trình và hiển thị một thông báo? Tôi biết ở Perl nó đơn giản như:

die("Message goes here")

Tôi mệt mỏi khi gõ cái này:

puts "Message goes here"
exit

10
Một nhận xét nhỏ, putsviết của bạn vào thiết bị xuất chuẩn, trong khi dieviết vào thiết bị lỗi chuẩn, vì vậy : $stderr.puts "Message goes here".
cdarke

Tôi biết rằng đây không phải là một câu trả lời, nhưng nó đã trả lời câu hỏi của tôi, cảm ơn
Patrick

Chỉ để tham khảo, trong Python nó là sys.exit("Message goes to stderr").
anatoly techtonik

Câu trả lời:


361

Các abortchức năng làm điều này. Ví dụ:

abort("Message goes here")

Lưu ý: aborttin nhắn sẽ được viết thành STDERRtrái ngược với tin nhắn sẽ được putsviết STDOUT.


6
Ồ Đẹp tìm thấy! Quá tệ, họ đã không quá tải lối ra với chức năng này ....
Mike Stone

56
Lưu ý, hủy bỏ chương trình với trạng thái sai thể hiện sự thất bại. thoát theo lối thoát mặc định với trạng thái đại diện thực sự thành công. Hãy chắc chắn rằng bạn sử dụng đúng cho tình huống.
Alex Spurling

1
tái Nhận xét của Mike Stone, đôi khi có vẻ như Ruby được viết bởi một nhóm người không có liên lạc với nhau, phải không? (Tuy nhiên, thật dễ dàng để lập trình trong đó.)
JellicleCat

24

Nếu bạn muốn biểu thị một lỗi thực tế trong mã của mình, bạn có thể đưa ra một RuntimeErrorngoại lệ:

raise RuntimeError, 'Message goes here'

Điều này sẽ in một stacktrace, loại ngoại lệ được đưa ra và thông báo mà bạn cung cấp. Tùy thuộc vào người dùng của bạn, một stacktrace có thể quá đáng sợ và thông điệp thực tế có thể bị mất trong tiếng ồn. Mặt khác, nếu bạn chết vì một lỗi thực tế, một stacktrace sẽ cung cấp cho bạn thông tin bổ sung để gỡ lỗi.


24
Bạn không cần đề cập đến RuntimeError để nâng cao một (đây là loại ngoại lệ mặc định được nêu ra) vì vậy đoạn mã sau sẽ đủ: nâng cao 'Tin nhắn đến đây'
sunaku 17/03/2016

sunaku - trong khi nhận xét của bạn là hoàn toàn hợp lệ, tôi thường thấy rằng rõ ràng hơn có thể hữu ích, đặc biệt đối với những người khác đọc mã sau này.
shevy

2

Tôi chưa bao giờ nghe nói về một chức năng như vậy, nhưng nó sẽ đủ tầm thường để thực hiện ...

def die(msg)
  puts msg
  exit
end

Sau đó, nếu điều này được xác định trong một số tệp .rb mà bạn bao gồm trong tất cả các tập lệnh của mình, thì bạn thật tuyệt vời .... chỉ vì nó không được tích hợp sẵn không có nghĩa là bạn không thể tự làm điều đó ;-)


3
Hóa ra chức năng 'hủy bỏ' thực hiện nó (xem câu trả lời của tôi bên dưới)
Chris Bunch

1
Tại sao viết mã khi hàm hủy bỏ làm điều đó cho bạn?
Gary Haran

2
@ChrisBunch Điều này không giống như chức năng hủy bỏ: exitmặc định trở lại như thể nó đã thành công. aborttrả lại một thất bại. exit 1cũng sẽ trả lại một thất bại.
TemporalWolf

2

Tôi đã đến đây để tìm cách thực thi một số mã bất cứ khi nào chương trình kết thúc.
Tìm thấy điều này :

Kernel.at_exit { puts "sayonara" }
# do whatever
# [...]
# call #exit or #abort or just let the program end
# calling #exit! will skip the call

Được gọi nhiều lần sẽ đăng ký nhiều xử lý.

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.