Objective c 对于特定于应用程序的异常,从NSException生成子类是一种好的做法吗?

Objective c 对于特定于应用程序的异常,从NSException生成子类是一种好的做法吗?,objective-c,exception,nsexception,Objective C,Exception,Nsexception,对于特定于应用程序的异常,从NSException生成子类是一种好的做法吗?这样,所有内容都集中在一个类中,便于管理 e、 g 不,将NSException子类化是不好的,因为它是一个不需要比现在更具体的类。此外,如文档中所述,子类在以下情况下可能无法接收正确的调用堆栈符号: 以NSException类或多个子类的形式出现的NSException子类 或其他干扰异常引发的API元素 机制可能无法获取此信息 如果希望抛出“预定义异常”,可以在NSAssert上编写宏 #define BOAsser

对于特定于应用程序的异常,从NSException生成子类是一种好的做法吗?这样,所有内容都集中在一个类中,便于管理

e、 g


不,将NSException子类化是不好的,因为它是一个不需要比现在更具体的类。此外,如文档中所述,子类在以下情况下可能无法接收正确的调用堆栈符号:

以NSException类或多个子类的形式出现的NSException子类 或其他干扰异常引发的API元素 机制可能无法获取此信息

如果希望抛出“预定义异常”,可以在NSAssert上编写宏

#define BOAssert NSAssert(0, @"Something bad just happened");

如果您需要“特定于应用程序的异常”,请创建一个常量,您可以将其传递到
+raise:format:
。但是请记住,Objective-C不是Java。异常不是控制流的一种手段,也不应该这样使用(Cocoa Touch中的任何内容都不能被视为异常安全)。因为异常是致命的,所以请认真考虑为什么您实际上需要抛出它们,以及在什么情况下——例如,UITableView在更新到未定义状态时抛出异常。

不,将NSException子类化是不好的,因为它是一个不需要比现有类更具体的类。此外,如文档中所述,子类在以下情况下可能无法接收正确的调用堆栈符号:

以NSException类或多个子类的形式出现的NSException子类 或其他干扰异常引发的API元素 机制可能无法获取此信息

如果希望抛出“预定义异常”,可以在NSAssert上编写宏

#define BOAssert NSAssert(0, @"Something bad just happened");

如果您需要“特定于应用程序的异常”,请创建一个常量,您可以将其传递到
+raise:format:
。但是请记住,Objective-C不是Java。异常不是控制流的一种手段,也不应该这样使用(Cocoa Touch中的任何内容都不能被视为异常安全)。因为异常是致命的,所以请认真思考为什么您实际上需要抛出它们,以及在什么情况下——例如,UITableView在更新到未定义状态时抛出异常。

我感到困惑。如果你能宏出NSASSERT,你为什么要这么做?你是说做断言比做异常好吗?@Boon你有这方面的最佳实践吗?如果有,请提供方法。我正在为我的应用程序寻找类似的方法。我很困惑。如果你能宏出NSASSERT,你为什么要这么做?你是说做断言比做异常好吗?@Boon你有这方面的最佳实践吗?如果有,请提供方法。我正在为我的应用程序寻找类似的方法。我同意你的观点,但将应用程序异常的管理集中在一个地方似乎很有用。我不理解关于NSAssert的建议,因为它们是两个完全不同的东西。@Boon断言抛出异常,它们不是“完全不同的东西”,它们比分配和抛出NSException更有效(语法方面)。底层机制可能是相同的,但目的不同,会影响代码读取。使用NSAssert获取异常似乎不如创建一个类来抛出异常,至少对于一个类,您可以做其他事情,比如将异常记录到一个文件中。感谢包括NSException子类摘录,非常有用。那么,这是一个折衷:要么得到不稳定的调用堆栈符号,我同意你的观点,但将应用程序异常的管理集中在一个地方似乎很有用。我不理解关于NSAssert的建议,因为它们是两个完全不同的东西。@Boon断言抛出异常,它们不是“完全不同的东西”,它们比分配和抛出NSException更有效(语法方面)。底层机制可能是相同的,但目的不同,会影响代码读取。使用NSAssert获取异常似乎不如创建一个类来抛出异常,至少对于一个类,您可以做其他事情,比如将异常记录到一个文件中。感谢您包含了NSException子类摘录,非常有用。那么,这是一个折衷:要么得到不稳定的调用堆栈符号,要么没有文件输出。