错误是流控制的一种形式,与if
和while
相提并论。特别是,它们涉及连贯的消息发送和提早退出。这个想法是立即结束当前作用域并将控制权返回给调用方,告诉调用方“出了点问题”。
断言是一种立即崩溃的方法。
因此,它们属于完全不同的概念世界。错误是指可能会实时出错的事情,我们需要从中连贯地恢复。断言是针对永远不会出错的事情,对此我们感到非常强烈,以至于在这种情况下我们甚至都不希望将该程序发布到世界上,并且可以在无法使用错误的地方使用。
我自己的代码示例:
final class Board : NSObject, NSCoding, CALayerDelegate {
// ...
fileprivate var xct : Int { return self.grid.xct }
fileprivate var yct : Int { return self.grid.yct }
fileprivate var grid : Grid // can't live without a grid, but it is mutable
// ...
fileprivate lazy var pieceSize : CGSize = {
assert((self.xct > 0 && self.yct > 0), "Meaningless to ask for piece size with no grid dimensions.")
let pieceWidth : CGFloat = self.view.bounds.size.width / (CGFloat(self.xct) + OUTER + LEFTMARGIN + RIGHTMARGIN)
let pieceHeight : CGFloat = self.view.bounds.size.height / (CGFloat(self.yct) + OUTER + TOPMARGIN + BOTTOMMARGIN)
return CGSize(width: pieceWidth, height: pieceHeight)
}()
// ...
}
如果用零网格尺寸调用
pieceSize
,则整个程序都出了问题。测试运行时错误不是问题。该程序本身基于错误的算法。这就是我要检测的。
我是一名优秀的程序员,十分优秀!