龙空技术网

zig编程语言快速入门——2.6 基础知识-Errors

南道 75

前言:

现时咱们对“c语言errors”都比较重视,各位老铁们都需要分析一些“c语言errors”的相关资讯。那么小编同时在网摘上汇集了一些有关“c语言errors””的相关文章,希望姐妹们能喜欢,姐妹们快快来了解一下吧!

Errors

一个错误集就像一个枚举(关于Zig的枚举的细节将在后面介绍),其中每个错误集是一个值。在Zig中没有例外,错误就是值。让我们来创建一个错误集 .

const FileOpenError = error{    AccessDenied,    OutOfMemory,    FileNotFound,};

错误集强制到它们的超集 .

const AllocationError = error{OutOfMemory};test "coerce error from a subset to a superset" {    const err: FileOpenError = AllocationError.OutOfMemory;    try expect(err == FileOpenError.OutOfMemory);}

一个错误集类型和一个正常类型可以用!操作符结合起来,形成一个错误联合类型。这些类型的值可以是一个错误值,也可以是一个正常类型的值。

让我们来创建一个错误联合类型的值。这里使用了catch,它后面是一个表达式,当它前面的值是一个错误时,这个表达式会被评估。这里的catch用来提供一个回退值,但也可以是一个noreturn - return、while (true)等的类型 .

test "error union" {    const maybe_error: AllocationError!u16 = 10;    const no_error = maybe_error catch 0;    try expect(@TypeOf(no_error) == u16);    try expect(no_error == 10);}

函数经常返回错误的联合体。这里有一个使用catch的,其中|err|语法接收错误的值。这被称为payload capturing,在很多地方都有类似的用法。我们将在本章后面更详细地讨论它。题外话:有些语言对lambdas使用类似的语法--Zig不是这种情况 .

fn failingFunction() error{Oops}!void {    return error.Oops;}test "returning an error" {    failingFunction() catch |err| {        try expect(err == error.Oops);        return;    };}

try x是x catch |err| return err的快捷方式,常用于不适合处理错误的地方。Zig的try和catch与其他语言的try-catch没有关系 .

fn failFn() error{Oops}!i32 {    try failingFunction();    return 12;}test "try" {    var v = failFn() catch |err| {        try expect(err == error.Oops);        return;    };    try expect(v == 12); // is never reached}

errdefer的工作方式与defer类似,但只在errdefer的块内有错误返回时执行 .

var problems: u32 = 98;fn failFnCounter() error{Oops}!void {    errdefer problems += 1;    try failingFunction();}test "errdefer" {    failFnCounter() catch |err| {        try expect(err == error.Oops);        try expect(problems == 99);        return;    };}

从一个函数返回的错误联合体可以通过没有明确的错误集来推断其错误集。这个推断的错误集包含了该函数可能返回的所有可能的错误 .

fn createFile() !void {    return error.AccessDenied;}test "inferred error set" {    //type coercion successfully takes place    const x: error{AccessDenied}!void = createFile();    //Zig does not let us ignore error unions via _ = x;    //we must unwrap it with "try", "catch", or "if" by any means    _ = x catch {};}

错误集可以被合并.

const A = error{ NotDir, PathNotFound };const B = error{ OutOfMemory, PathNotFound };const C = A || B;

anyerror是全局错误集,由于它是所有错误集的超集,可以将任何错误集的错误凝聚成它的一个值。一般应避免使用它 .

标签: #c语言errors