整个应用程序的异常处理

2024-04-10

我对 iPhone 中的异常处理有一些疑问。他们是这样的:

  1. 假设我有一连串被依次调用的方法,即方法 A 调用方法 B,方法 B 又调用方法 C,方法 C 调用方法 D。这是放置我的 try-catch 块的最佳位置(是方法 A、B、C、D 还是所有方法)。另外,我需要向用户显示发生异常的警报,然后我想将此异常记录到我的服务器。因此,如果我在所有这些方法中编写 try - catch 块,并且方法 D 中发生异常;那么我认为警报将显示 4 次,并且用于日志记录的 Web 服务也将被调用 4 次(直到控制到达方法 A 的 catch 块)。那么,我应该只使用 @throw; 吗?在方法 B、C 和 D 的 catch 块中,并将我的逻辑写入方法 A(顶级方法)的 catch 块中,或者我应该避免在方法 B、C 和 D 中编写 try - catch 。

  2. 我需要来自异常的某种错误代码(因为我的 Web 服务需要参数错误代码和描述)。是否可以将异常转换为错误,或者我需要对此代码进行硬编码?

  3. 我在某处读过有关 NSSetUncaughtExceptionHandler 的内容。我想,如果我可以设置这个处理程序(在应用程序委托的 appDidFinishLaunching 方法中)和处理程序方法中,如果我向用户显示一些警报并调用 Web 服务;那么我不需要在每个方法、每个类中编写 try - catch 块。我对吗??

  4. 如果发生异常并且我编写了 try - catch 块或 NSSetUncaughtExceptionHandler,那么我的应用程序会继续运行还是不会响应任何用户事件。 (我确信它会处理崩溃。我想知道它是否会挂起)

有人请告诉我这个例外主题。


0) 避免 Cocoa 中的异常。它们通常是不可恢复的。您可能会在自己的错误报告中捕获它们,但假设您可以从中恢复通常是不安全的。

1)如果你需要抓住,就抓住它立即地. 不要写自己的抛出-- 相反,将其转换为类似NSError并将其传递出去。NSError可以包含显示或发送错误代码以及本地化消息所需的所有信息。

2) 您无法转换NSException进入一个NSError(直接)因为NSException不具有所有属性NSError有 - 这是一种不同的数据表示形式。其一,错误代码不可用。二是描述不本地化。您能做的最好的事情就是创建错误代码和域,然后使用您需要的属性NSException并将其存储在NSError。这可能类似于以下内容:

// error checking omitted
extern NSString* const MONExceptionHandlerDomain;
extern const int MONNSExceptionEncounteredErrorCode;

NSError * NewNSErrorFromException(NSException * exc) {
    NSMutableDictionary * info = [NSMutableDictionary dictionary];
    [info setValue:exc.name forKey:@"MONExceptionName"];
    [info setValue:exc.reason forKey:@"MONExceptionReason"];
    [info setValue:exc.callStackReturnAddresses forKey:@"MONExceptionCallStackReturnAddresses"];
    [info setValue:exc.callStackSymbols forKey:@"MONExceptionCallStackSymbols"];
    [info setValue:exc.userInfo forKey:@"MONExceptionUserInfo"];

    return [[NSError alloc] initWithDomain:MONExceptionHandlerDomain code:MONNSExceptionEncounteredErrorCode userInfo:info];
}

@catch (NSException * exc) {
    NSError * err = NewNSErrorFromException(exc);
    ...
}

如果您使用的 API 抛出异常,您需要捕获并从中恢复(例如,不是真正的异常情况),那么是的,您可以捕获并尝试继续。不幸的是,任何在 Cocoa 中编写异常并意图捕获它们的人可能都没有很好地理解这些问题,无法实现可靠的展开实现(例如,即使它产生泄漏,它也不是可靠的)。

3) 这确实不是显示警报的时间或地点。如果您安装顶级异常处理程序(通过NSSetUncaughtExceptionHandler) - 您应该简单地记录一条消息——然后异常处理程序将中止。您的应用程序处于不稳定状态 - 继续比中止更糟糕。您可能想将这些自定义消息发送回家,最好在下次启动应用程序时这样做。

4) 在大多数情况下,您的应用程序处于不稳定状态,您不应该继续。但是,要真正回答这些极端情况:“是的,您可以在捕获时恢复并继续,但您应该仅在抛出 API 声明支持恢复时尝试恢复并继续。如果问题超出您的控制范围,并且问题并不例外(例如,找不到文件),并且供应商确实希望您继续,那么我必须假设他们希望您继续,即使它确实不是(100%安全)。”。不要尝试从顶级异常处理程序中恢复/继续(程序将在返回后中止)。如果您想要非常奇特并立即在 OSX 上呈现,那么另一个过程将是最好的。如果您通过纯 C++ 接口进行调用,则展开已明确定义,并且需要捕获 - 如果可以恢复,请继续。 C++ 中的异常是可恢复的并且定义良好 - 它们也被广泛使用(包括小于异常的条件)。

(IMO...)不应引入 ObjC 中的异常,并且应弃用从系统或第三方库抛出的任何方法。他们不能很好地放松,或者以一种明确的方式放松。同样,展开流程与正常的 Cocoa 程序流程相反。这意味着触摸任何 objc 对象的内存/关系(在抛出时发生突变并且位于抛出和捕获之间)与未定义的行为一样好。问题是 - 您不知道该内存是什么(在大多数情况下,并且在合理的维护时间内)。 C++ 异常定义良好,并且它们正确展开(例如调用析构函数) - 但尝试在 ObjC 上下文中继续会忽略未定义行为的任​​何后果。 IMO,它们应该只存在于 ObjC++ 中(因为 C++ 需要它们)。

在理想的世界中,您的 ObjC 程序和您使用的库不会(根本)使用异常。由于您使用会抛出异常的库(包括 Cocoa),因此请安装顶级异常处理程序仅当您需要有关错误的一些特殊信息时。 API 要求您可能会抛出异常由于您无法控制的情况,您预计会康复,然后编写一个 catch 但立即将该逻辑转换为正常的程序流(例如NSError) - 你永远不需要编写自己的抛出。-[NSArray objectAtIndex:和“对象不响应选择器”是程序员错误的例子 - 他们应该not会被抓住,但程序应该被纠正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

整个应用程序的异常处理 的相关文章

  • SceneKit unproject Z 文档解释?

    我正在经历一些 SceneKit 概念 而我试图在脑海中巩固的一个概念是 unprojectPoint 我知道该函数将获取 2D 中的一个点并返回 3D 中的一个点 因此具有正确的 Z 值 当我阅读文档时 我读到了以下内容 method u
  • 为具有多个目标和不同平台的项目编写 Podfile

    我正在准备一个支持 OS X 和 iOS 的 Pod 我的 pod 有一些自己的依赖项 这些依赖项在 podspec 文件中定义 因此我使用 Podfile 来管理我用来开发 pod 和运行测试的项目的依赖项 我正在使用 CocoaPods
  • Objective C 中类别是如何实现的?

    作为一名程序员 我知道如何使用类别 但我很好奇它们是如何实现的 编译器是否将它们编译为对类替换方法 http developer apple com library mac documentation Cocoa Reference Obj
  • 在 ios 版 Ionic 中接收 URL

    我正在使用离子框架 我正在尝试设置一种从另一个应用程序接收网址的方法 就像 您在浏览器中 单击共享 然后将链接发送到另一个应用程序 我的应用程序 我找到了这个cordova https stackoverflow com questions
  • 在情节提要中将 Segue 拖至自身

    我想将一个 Segue 从我的视图控制器拖到其自身 所以我可以推送该特定视图控制器的 无限 实例 我知道如何在代码中执行此操作 即以编程方式实例化视图控制器 但是 我想尽可能使用 segues 我发现了一些在故事板中进行自我延续的 技巧 但
  • NSURLCache 不缓存

    我正在使用 Xcode 6 1 6A1030 iOS7 和 iOS8 模拟器 NSURLCache 似乎没有缓存任何东西 我使用 Cache Control 标头 我的服务器返回带有 max age 6000 的 Cache Control
  • 访问 google reader 的 Endpoints API 时出错

    我正在尝试在iPhone APP中实现google reader 到目前为止我已经成功收到了sid and auth 当我尝试使用以下命令调用 Endpoints API 时 问题就出现了GET 这是代码 ASIHTTPRequest re
  • 如何将CIFilter应用到UIView上?

    根据Apple docs 过滤属性CALayer不支持iOS 当我使用正在申请的应用程序之一时CIFilter to UIView即 Splice Funimate 和 Artisto 的视频编辑器 Videoshow FX 这意味着我们可
  • 错误:任务“:app:mergeDebugResources”执行失败。 > java.lang.ArrayIndexOutOfBoundsException(无错误消息)

    你们有人知道 Gradle 构建中的这个异常吗 Error Execution failed for task app mergeDebugResources gt java lang ArrayIndexOutOfBoundsExcept
  • 带有 allowedEditing 的 UIImagePickerController 不允许平移裁剪

    我在这里看到这个问题 UIImagePicker 允许编辑卡在中心 https stackoverflow com questions 12630155 uiimagepicker allowsediting stuck in center
  • UILabel 中的文本未垂直居中

    我使用以下代码创建了一个标签 func setupValueLabel valueLabel numberOfLines 1 valueLabel font UIFont name Avenir Black size 50 valueLab
  • 如何在Sprite Kit中实现鼠标关节?

    我已经在 iOS 上用 Cocos2d Box2d 编写了拖放功能的工作实现 我需要将它移植到 Sprite Kit 逻辑非常基本 当用户触摸屏幕时 找到手指下的精灵 在找到的精灵和场景的物理体之间创建鼠标关节 将关节的目标设置为触摸位置
  • 当 ViewController 从 UIStoryboard 实例化时,isMemberOfClass 返回 no

    我有一个 OCUnit 测试类 PatientTestViewControllerTests 下面是界面 interface PatientTestViewControllerTests SenTestCase property nonat
  • UILabel UILongPressGestureRecognizer 不起作用?

    我怎样才能得到UILongPressGestureRecognizer在 uilabel 当我实现以下代码时 它不会调用该函数 那么请告诉我我做错了什么 UILongPressGestureRecognizer longPress UILo
  • 带有文本字段的 iPhone AlertView

    我有一个UIAlertView with a UITextField在里面 我想输入mail id并提交于UIAlertView s ok按钮 但是UITextField in the UIAlertView没有回复 请帮助我 thankz
  • 使用 ELMAH 记录 WCF 服务的异常

    我们正在使用优秀的ELMAH http code google com p elmah处理 ASP NET 3 5 Web 应用程序中未处理的异常 这对于除使用 REST 功能使用的 WCF 服务之外的所有站点都非常有效 当操作方法中发生应
  • 动画 UICollectionView 单元格大小更改并重新定位周围单元格

    Goal 以动画方式改变单元格的高度并重新定位周围的单元格 设想 集合视图中的某些单元格会加载远程图像 最初 这些单元格的大小是静态的 并显示活动指示器 加载图像后 会将其添加到其单元格中 并且更改单元格的高度以适合照片 Notes 我正在
  • WKWebview 中的 iCLoud 文档选择器关闭容器视图

    我有一个 WKWebview 加载基于 Web 的 UI 我希望用户能够从其 iCloud 文档上传文件 我已授予正确的权限 并且可以浏览 iCloud 文档 但是 当我选择文件或单击取消按钮时 文档选择器视图也会关闭 WKWebview
  • 如何将自定义 C 代码放入 SwiftPM 包中?

    我正在尝试将 C 代码打包到 Swift 模块中 我们称之为CModule 一旦我将其放入项目的基本文件夹中 Swift模块 并配置了搜索路径 我可以在 Swift 文件中自动完成工作 并检测错误 警告 问题是 导入时它无法识别该模块 并且
  • iPhone Twitter SDK 与 iOS 5 设备的集成问题

    我已成功将 Twitter Sharekit 与我的 iPad 应用程序源集成 当我在模拟器和装有 iOS 4 X 的 iPad 1 上测试该应用程序时 它运行完美 并且成功发布了推文 但是 如果我在装有 iOS 5 的 iPad 2 上安

随机推荐

  • FAILED 错误:java.io.IOException:所有收集器的初始化失败

    我在运行 MapReduce WordCount 作业时遇到一些错误 错误 java io IOException 所有收集器的初始化 失败的 最后一个收集器中的错误是 class wordcount wordmapper at org a
  • Webpack - extract-text-webpack-plugin 找不到模块

    webpack config js var ExtractTextPlugin require extract text webpack plugin 如果我刚刚实现该插件 我会立即收到此错误 module js 339 throw err
  • URLLoader 数据到 BitmapData

    我正在尝试加载 SWF 文件旁边的图像文件 像这样的东西 var loader URLLoader new URLLoader loader dataFormat URLLoaderDataFormat BINARY loader addE
  • MVC 与前端控制器混淆

    简化问题 我正在学习 oop 模式 并且希望构建自己的简单 mvc 框架 我希望它有一个前端控制器 但我发现很难找到任何可靠的信息来使用 MVC 实现前端控制器 特别是我很困惑前端控制器是否应该启动整个三元组 或者前端控制器是否只是简单地调
  • SKScene 中的 Segue 到 UIViewController

    在我的 GameScene swift 文件中 我尝试执行返回到我的菜单视图控制器的操作 如下所示 func returnToMainMenu var vc UIViewController UIViewController vc self
  • MySQL CASE 是如何工作的?

    我知道 SQL 的CASE语法如下 CASE WHEN search condition THEN statement list WHEN search condition THEN statement list ELSE statemen
  • javascript 函数绑定到什么对象(它的“this”是什么)?

    我知道它在函数内部this var func function return this f arguments callee gt true if bound to some object gt false if is bound to n
  • 如何找到csv文件列的平均值

    import csv with open Met csv r as f reader csv reader f delimiter quoting csv QUOTE NONE for row in reader print row 我无法
  • 显示包含扩展信息的页面

    I have the following functionality given below 单击详细信息时 我希望内容视图上显示的文本应显示在由推送异步创建的新详细信息页面上 如何发送包含内容中给出的信息的参数 例如标题 类别和描述 我有
  • 来自 keras 模型中图像列表的 TensorFlow 数据集

    我试图了解如何读取本地图像 将它们用作 TensorFlowDataset https www tensorflow org api docs python tf data Dataset并使用 TF 数据集训练 Keras 模型 我正在关
  • 为什么没有为原始数据类型分配内存? [复制]

    这个问题在这里已经有答案了 char bool 和 int 等原始数据类型有一定的内存 假设char 它有1个字节的内存 当我们在代码中使用 char 变量时 该变量必须需要 1 个字节的内存 在这种情况下我们为什么不分配内存呢 由于我们从
  • Spring - 需要在 @Component 类中自动装配 @RestController 类

    我在同一个 Maven 父模块下组合了 Web 和核心项目 如下所示 家长 网络 com parent test web 核心 com parent test core 我想参考核心项目中的Web模块依赖项来调用Web模块中的一些api 网
  • 从打开的“fancybox”中的功能关闭花式框

    大家好 我希望能够在从内部打开 fancyBox 时将其关闭 我已尝试以下方法但无济于事 function closeFancyBox html var re Element insert complete gi if html searc
  • Tensorflow 对象检测 API 索引越界

    运行 Android TF Detect 演示并使用我重新训练的 3 类 ssd mobilenet v1 coco 模型后 我的 TF 检测演示崩溃 给出索引越界异常这是 12 26 17 53 13 931 22429 25212 or
  • 设置Loader项目属性

    In the context https stackoverflow com questions 33513546 delegate folderlistmodel in tableview文件管理器 我有一个TableView组件保存在文
  • JavaScript 组织 |带模块的模块模式

    我将代码组织成 20 60 行模块 通常采用模块模式 我想要一个结构良好的面向对象的 JavaScript 库 这是最好的方法吗 该代码已经过测试并且可以工作 我喜欢它 因为程序员可以从库中提取模块并根据需要使用它们 它们是独立的 这里是
  • ASP.Net MVC - 处理错误的 URL 参数

    处理访问者构建自己的 URL 并将我们期望的 ID 替换为他们喜欢的任何内容的最佳方法是什么 例如 ASP Net MVC 处理错误的 URL 参数 https stackoverflow com questions 236349 但用户可
  • 如何将已经编译好的C库添加到Android中?

    我已经编译了库 针对 linux a 和 windows dll 我需要将其中一个 我想对于 Android 我将不得不使用 a 库导入到我的 android 项目中 所以我已经阅读了一些关于 NDK 的教程 但这里有一个问题 我是否需要源
  • Emgu CV 和官方 Microsoft Kinect SDK?

    Emgu CV http www emgu com wiki index php Main Page目前允许将 Kinect 与 OpenNI 驱动程序一起使用 http www emgu com wiki index php Downlo
  • 整个应用程序的异常处理

    我对 iPhone 中的异常处理有一些疑问 他们是这样的 假设我有一连串被依次调用的方法 即方法 A 调用方法 B 方法 B 又调用方法 C 方法 C 调用方法 D 这是放置我的 try catch 块的最佳位置 是方法 A B C D 还