首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift语言中的Objective框架处理错误

Swift语言中的Objective框架处理错误
EN

Stack Overflow用户
提问于 2015-11-18 18:59:48
回答 2查看 1.4K关注 0票数 4

我正在使用Objective框架创建一个iOS Swift应用程序。

框架头文件(SMPort.h):

代码语言:javascript
复制
// ... do all the import //

@interface PortException : NSException
{
}

@end

@interface PortInfo : NSObject

- (id)initWithPortName:(NSString *)portName_ macAddress:(NSString *)macAddress_ modelName:(NSString *)modelName_;

@property(retain, readonly) NSString *portName;
@property(retain, readonly) NSString *macAddress;
@property(retain, readonly) NSString *modelName;
@property(readonly, getter=isConnected) BOOL connected;

@end

@interface SMPort : NSObject {
    void * m_port;
    WBluetoothPort* wBluetoothPort;
    BluetoothPort* bluetoothPort;
    NSString * m_portName;
    NSString * m_portSettings;
    int m_ioTimeoutMillis;

    BOOL checkedBlockSupport;
}

@property(assign, readwrite, nonatomic) u_int32_t endCheckedBlockTimeoutMillis;

// Initializer and staff methods...

/*!
*  This function retreives the device's detailed status.
*
*  @param starPrinterStatus Pointer to a StarPrinterStatus_n structure where the devices detailed status is written
*                           (either StarPrinterStatus_0, StarPrinterStatus_1, or StarPrinterStatus_2).
*  @param level             Integer designating the level of status structure (either 0, 1, or 2).
*
*  @note Throws PortException on failure.
*/
- (void)getParsedStatus:(void *)starPrinterStatus :(u_int32_t)level;

// The other methods...

我阅读了框架文档,并找到了目标-C代码(工作非常好):

代码语言:javascript
复制
@try
{
    [starPort getParsedStatus:&status :2];
}
@catch (PortException *exception){
    // Print error
}

所以我试着在Swift 2.1中做这样的事情:

代码语言:javascript
复制
do{
    try starPort.getParsedStatus(status , 2)
}
catch is PortException{
    print("error")
}

但是,当错误发生时,编译器停止应用程序,说我没有捕捉到该错误:

2015-11- 18 :59:51.297 $$$$$$$$$$:$$$$$ *终止应用程序由于未登录异常' PortException ',原因:‘本机GetParsedStatusEx失败’*第一次抛出调用堆栈:(0x2524a67b 0x36e170xa3af7 0x6f378 0x6f3d8 0x6fc0 0x6fd10 0x6ff00 0x87bf8 0x87bf8 0x87d80 0x2515559 0x293714e9 0x293594ff 0x29370e45 0x370abf 0x2936947f 0xdb33a561 0x38b0x20200ff 20xd257b25255bb2525250x0155b1555b1555b155255x0f0fx2ffx2ffx2ffx0fx218:18:59:59:0x5x3fc 7)

我也尝试过这样的方法:

代码语言:javascript
复制
func doGPS() throws { starPort.getParsedStatus(status ,2) }
func test() {
   do {
      try doGPS()
   } catch is PortException{
      print("Error")
   } catch{
      print("WTF? : \(error)")
   }
}

test()

得到同样的结果..。

那么,如何在SWIFT2.1中捕获这个错误呢?

这里是SMPort.h https://github.com/gabebear/receiptbooth/blob/master/StarIO.framework/Headers/SMPort.h的完整代码

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-18 19:56:11

这是一个很好的问题!这是一个需要解决的合法问题。不幸的是,你目前还不能做到这一点。原因如下:

快速异常处理与异常无关。实际上,您无法捕获NSException,这就是Obj端正在引发的问题。Swift捕捉到NSError,这实际上是一个Enum (在Swift中)。长话短说,在目标C中有两种处理错误的模式-C: 1.引发NSException 2.返回NSError

正如我所解释的,您不能处理使用第一种方法引发的错误。因此,实际上,您必须修改目标-C代码,以遵循第二种方法,使用NSError。

一些很好的链接:

https://www.bignerdranch.com/blog/error-handling-in-swift-2/ https://forums.developer.apple.com/thread/7582

票数 2
EN

Stack Overflow用户

发布于 2015-11-18 23:08:25

因此,感谢@Peyman和@dan,我编写了两个新的目标C文件,其中我实现了一个新方法(扩展SMPort类),该方法捕获错误并返回一个NSError

SMPort+Handler.h

代码语言:javascript
复制
#import <Foundation/Foundation.h>
#import <StarIO/SMPort.h>
@interface SMPort ( Handler )

- (BOOL)getParsedStatusThrowing:(void *)starPrinterStatus
                          level:(u_int32_t)level
               didFailWithError:(NSError **)error;

@end

SMPort+Handler.m

代码语言:javascript
复制
#import "SMPort+Handler.h"

@implementation SMPort ( Handler )


- (BOOL)getParsedStatusThrowing:(void *)starPrinterStatus
                          level:(u_int32_t)level
               didFailWithError:(NSError **)error
{
    @try
    {
        [self getParsedStatus:&starPrinterStatus :level];
        return TRUE;
    }
    @catch (PortException *exception){
        NSMutableDictionary* details = [NSMutableDictionary dictionary];

        // exemption.name in my case should be PortExeption
        [details setValue:exception.name forKey:NSLocalizedDescriptionKey];

        *error = [NSError errorWithDomain:@"somedomain" code:100 userInfo:details];
        return FALSE;
    }
}

@end

现在,我只需要(在我的Swift代码中):

代码语言:javascript
复制
 do{
    //starPort.getParsedStatus(status ,2)
    try starPort.getParsedStatusThrowing(status, level: 2)

    defer{
       // Release the port in any case.
       SMPort.releasePort(starPort)
    }
 }catch{
    print(error)
    // do staff like return
 }

非常感谢!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33788183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档