struct Dual<T> { var value: T ; var check_value: T }
fatalError
を使うのが適切かと、 Swift が fatalError
を含む Universal Error をハンドリングする方法を提供していないことは切り分けて考えた方がいいと思います。fatalError
だけ代わりの方法で対処できたとしても、その他の Universal Error (メモリが足りないとかスタックオーバーフローとか)は起こりうるので、結局それらが発生したっ場合のログは送れないですし。Swift could support a secondary, untyped propagation mechanism using "zero-cost" exceptions. ... However, this work is outside of the scope of Swift 2.0.
https://github.com/apple/swift/blob/master/docs/ErrorHandlingRationale.rst#universal-errors とあり、将来的にサポートされる可能性もあるかと。do
- try
- catch
以外のメカニズムがいいと思いますが。Exception
を RuntimeException
のスーパークラスにしてしまったこと( Logic Failure を Recoverabble Error の下位においてしまったこと)、構文がイケてなかったことあたりが相互に影響して使い勝手が悪くなってしまったと思ってます。Exception
, Error
, RuntimeException
がそれぞれ Recoverable Error, Universal Error, Logic Failure の意味合いで適切に使い分けられてたら問題がないはず。 (edited)fatalError
とログにどう折り合いをつけるかについてでした。 一般的に Universal Error ( fatalError
含む)はハンドリングされることを想定しないエラーですが、とはいえログを取りたいというような用途ではハンドリングして処理を挟み込みたかったりします。ですが、 Swift にはその言語機能がないので今はできません。しかし、それを回避するために、本来 fatalError
である場所を Recoverabble Error 等にしてもコードが複雑化してしまいます。たとえば、一番ルートで全部まとめてハンドリングしてログをとろうとしたら、そのスタックトレース上のすべての関数が throws
でないといけなくなります。 結局、そこまでしてもそれで対処できる Universal Error は一部であり、ログをとれない Universal Error は他にもあるので、それだったら設計的にキレイな方に倒しておいて、本当に必要な箇所だけハンドリングできるようにするのが良いバランスかなと思います。 ということが「fatalError を使うのが適切かと、 Swift が fatalError を含む Universal Error をハンドリングする方法を提供していないことは切り分けて考えた方がいいと思います。」で言いたかったことです。fatalError
にしたいけど、万が一到達したときにはログだけはとっておきたいという話なら、 @moaible さんの言うようなログを貯めておく方法が良さそうですね。fatalError
するか。fatalError
でいいと思います。Array
の subscript
も使うなって話になっちゃいますし。let a: Int if (cond) { fatalError("illegal") } else { a = 3 } showValue(a)
(edited) -> Never
なログを送る関数を作るとか。var logger: ((String) -> Void)?
プロパティがあって、セットしておくとverboseなログが取れるライブラリ設計とかはたまにみるfunc SignalHandler(sig: Int32) { let url = URL.init(string: "http://www.google.com")! UIApplication.shared.open(url, options: [:], completionHandler: nil) sleep(1) exit(sig) } @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { signal(SIGILL, SignalHandler)
なんとなく成功したけどやっちゃ駄目な気がするw