从绑定库中捕获异常

时间:2014-11-10 18:28:35

标签: ios binding xamarin.ios xamarin

我已将Star Micronics SDK绑定到我的Xamarin应用程序。我的应用程序随机崩溃,但出现以下错误:

SIGABRT - 'PortException', reason: 'Native WritePort failed'

我的绑定方法如下:

[BaseType (typeof (NSObject))]
public partial interface SMPort {

    //...

    [Export ("writePort:::")]
    Int32 WritePort (IntPtr writeBuffer, int offSet, int size);

}

我用它来称呼它:

    private static void Print(NSMutableData commandsToPrint) {
        try {
            //...
            int count = printerPort.WritePort (test, 0, Convert.ToInt32(dataBytes.Length));

        } catch (Exception e) {
            //...
        } finally {
            //Release the port
            SMPort.ReleasePort (printerPort);
        }

原始C库的Objective-C实现捕获了一个PortException异常:

@try
{
    [starPort writePort:dataToSentToPrinter :totalAmountWritten :remaining];
}
@catch (PortException *exception)
{
    //...
}
@finally
{
    //...
}

如何在我的Xamarin应用程序中捕获相同的异常,以便我可以处理异常并阻止应用程序崩溃?

1 个答案:

答案 0 :(得分:0)

从托管代码捕获Objetive-C异常不是受支持的方案[1],有时可能有效,有时则无法使用。

在您的特定情况下,最简单的解决方案是将第三方本机库包装在另一个库中(您自己编写),这会将Objective-C异常转换为任何其他错误报告机制(返回错误代码)实例)。

所以在C中你有类似的东西:

int call_writeport (SMPort *starPort, void *dataToSendToPrinter, int totalAmountWritten, int remaining)
{
    @try
    {
        [starPort writePort:dataToSentToPrinter :totalAmountWritten :remaining];
        return 0;
    }
    @catch (PortException *exception)
    {
        return 1;
    }
}

在C#中你可以将它绑定为DllImport:

[DllImport ("__Internal")]
static extern int call_writeport (SMPort port, IntPtr writeBuffer, int offset, int size);

和用法:

if (call_writeport (port.Handle, writeBuffer, offset, size) != 0)
    Console.WriteLine ("Writing to port failed");

我选择编写C方法(并使用P / Invoke进行绑定)是任意的,您可以轻松地创建一个Objective-C类并将其绑定到绑定项目中。

[1] Apple强烈建议不要使用Objective-C异常,除了最致命的情况之外,这就是为什么我们没有优先考虑我们的最终目的。