2009-03-19 9 views
14

Czy ruby ​​pozwalają traktować ostrzeżenia jako błędy?Czy możesz poprosić ruby ​​o traktowanie ostrzeżeń jako błędów?

Jednym z powodów, dla których chciałbym to zrobić, jest upewnienie się, że jeśli uśmiercenie usunięcia linii kodu oznacza, że ​​pojawiło się ostrzeżenie, mam możliwość zapewnienia, że ​​mutant zostanie zabity.

+0

Złożyłem żądanie funkcji dla flagi linii poleceń, aby ostrzec wyjątki ... http://redmine.ruby-lang.org/issues/show/3916 –

+0

Doktor What's RFE otrzymał odpowiedź, że ustawienie $ DEBUG = true powoduje, że "zbyt wiele argumentów dla ciągu formatu" ma zostać zmienionych z ostrzeżenia na wyjątek. –

+0

@TheDoctorCo twój link jest nieaktualny. Nowy link: https://bugs.ruby-lang.org/issues/3916 –

Odpowiedz

29

Nie ma niestety prawdziwy sposób w ten sposób, przynajmniej nie na większości wersji Ruby tam (wariacje może istnieje), krótkie monitorowania wyjście programu i przerwanie go, gdy na standardowym wyjściu błędów pojawia się ostrzeżenie . Oto dlaczego:

  • Ruby definiuje Kernel.warn, które może przedefiniować zrobić cokolwiek chcesz (w tym wyjściu), i której bym oczekiwać (mam nadzieję) stosowany konsekwentnie przez Ruby zgłosić ostrzeżeń (w tym także np ostrzeżenia analizowania) ale
  • sposoby realizowane natywnie (w C) w środku Ruby z kolei bezpośrednio wywoływać natywną metodę zwaną rb_warn z source/server.c całkowicie z pominięciem nowej definicji Kernel.warn (np. W „string literal in condition” ostrzeżenie, na przykład, wydane, gdy robi coś takiego: do_something if 'string', jest drukowany za pomocą natywnego rb_warn z source/parse.c)
  • dokonać rzeczy jeszcze gorsze, istnieje dodatkowa, rb_warning natywny sposób, który może być stosowany przez Ruby aby rejestrować ostrzeżenia, jeśli określono -w lub -v.

Tak więc, jeśli trzeba podjąć działania wyłącznie na ostrzeżeń generowanych przez kod aplikacji woła Kernel.warn następnie prostu przedefiniować Kernel.warn. W przeciwnym razie trzeba dokładnie dwie opcje:

  1. zmieniają source/error.c aby wyjść w rb_warn i rb_warning i odbudować Ruby
  2. monitorować standardowe wyjście błędu swojego programu dla „: warning:”, i przerwie go (i rb_warn_m?) mecz
+4

Dzięki. Autorytatywna odpowiedź, jeśli kiedykolwiek ją widziałem! –

+0

Aby monitorować standardowe wyjście błędów programu dla ": warning:", przydatne może być http://stackoverflow.com/a/32941696/18096. –

1

można też potencjalnie wykorzystać DTrace i przechwycenie wywołań rb_warn i rb_warning, mimo że nie zamierza produkować wyjątki można ratowania skądś. Zamiast tego po prostu umieści je gdzieś, gdzie możesz je łatwo zalogować.