如果我在Swift中有一个数组,并尝试访问超出范围的索引,则会出现一个不足为奇的运行时错误:
var str = ["Apple", "Banana", "Coconut"]
str[0] // "Apple"
str[3] // EXC_BAD_INSTRUCTION
Run Code Online (Sandbox Code Playgroud)
但是,我会想到Swift带来的所有可选链接和安全性,这样做会很简单:
let theIndex = 3
if let nonexistent = str[theIndex] { // Bounds check + Lookup
print(nonexistent)
...do other things with nonexistent...
}
Run Code Online (Sandbox Code Playgroud)
代替:
let theIndex = 3
if (theIndex < str.count) { // Bounds check
let nonexistent = str[theIndex] // Lookup
print(nonexistent)
...do other things with nonexistent...
}
Run Code Online (Sandbox Code Playgroud)
但事实并非如此 - 我必须使用ol' if语句来检查并确保索引小于str.count.
我尝试添加自己的subscript()实现,但我不知道如何将调用传递给原始实现,或者不使用下标符号来访问项目(基于索引):
extension Array {
subscript(var index: Int) …Run Code Online (Sandbox Code Playgroud) 如何处理未明确抛出的方法或代码的错误?
将其包装为do/catch块会导致编译器警告:
"'catch' block is unreachable because no errors are thrown in 'do' block"
Run Code Online (Sandbox Code Playgroud)
来自C#/ JAVA背景,至少可以说这是一个奇怪的事.作为开发人员,我应该能够在do/catch块中保护和包装任何代码块.仅仅因为方法未明确标记为"throw"并不意味着不会发生错误.
我是Swift的新手,我有一点问题.
我有一段代码,任何行都可能抛出错误.
我的问题是,我不希望逐行捕获每个错误,我想在一个语句中捕获它们.
在python中你可以做到这一点
try:
exampleArray = [1,2,3,4]
print(exampleArray[4])
except Exception as e:
print(e)
pass
Run Code Online (Sandbox Code Playgroud)
这样做是尝试从不存在的数组中打印一个值,但它被except语句捕获,我想知道Swift中是否存在这么简单的东西
为了澄清,我不是想捕捉index out of range错误,我只是想捕捉错误,无论它是什么.
是否可以在不声明我自己的错误的情况下逐行抛出它们?
我正在对应用程序运行模糊测试,因此我正在寻找未处理的运行时错误.该应用程序是用ObjC和Swift编写的,但单元测试是用Swift编写的.
我理解swift的基础不是捕获任意运行时异常,但这纯粹是为了单元测试.如何捕获运行时这些异常(即索引越界等)
为了防止潜在的崩溃,每当我尝试访问阵列中的特定元素时,我通常会进行一些安全检查.我才意识到我已经厌倦了这样做.有没有办法快速安全地完成?
var array:[String] = [/*Filled with stuff*/]
func someFunc(someIndex:Int){
//This is unsafe. It will crash if index is negative or larger than count.
let text = array[someIndex]
//This is completely safe, but boring.
let text:String
if someIndex >= 0 && someIndex < array.count{
text = array[someIndex]
}else { return }
//What I want is something like this:
let text = array.hasElement(at: someIndex) ? array[someIndex] : return
//I know, I can't really put a 'return' in a statement like this, but …Run Code Online (Sandbox Code Playgroud)