func _throwsShim<T>(_ value: T) throws -> T { value } func test() throws -> Int { return try _throwsShim(1) } とかで良さそう、そしたら _capture は @autoclosure も rethrows もいらず, (edited) func _capture<T>(_ value: T, column: Int) -> T { values.append(Value(value: _toString(value), column: column)) return value } return try _throwsShim(_capture(_capture(foo, column: 0).bar(_capture(baz, column: 8)), column: 4)) とか。