首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

有没有办法让await返回Result<T、E>而不是T?

在Rust编程语言中,可以通过使用asyncawait关键字来实现异步编程。在使用await时,它会等待一个实现了Future trait的类型,并返回该类型的结果。默认情况下,await返回的是T类型的值,但是如果希望返回Result<T, E>类型的值,可以使用?操作符来处理错误。

具体来说,可以在async函数中使用?操作符来处理可能的错误,如果发生错误,?操作符会将Result类型的错误值直接返回给调用者。以下是一个示例:

代码语言:txt
复制
use std::io;

async fn read_file() -> Result<String, io::Error> {
    let file = tokio::fs::File::open("file.txt").await?;
    let mut contents = String::new();
    file.read_to_string(&mut contents).await?;
    Ok(contents)
}

在上面的示例中,read_file函数尝试打开一个文件并读取其内容。如果打开文件或读取内容时发生错误,?操作符会将错误值直接返回给调用者。

相关搜索:如何将`Result<T、E>`转换为`Option<T>`,错误返回None?有没有办法在衬底模块内使用标准的Result<T,E>类型?让林特将类型"Ref <T>“识别为"T”而不是"ObjectId“返回IOrderedEnumerable <T>而不是IEnumerable <T>的方法是否有利?与返回Try[T]的函数进行映射以返回Try[T]而不是列表[Try[T]]返回ICollection <T>而不是List <T>的真正好处是什么?T-SQL返回单个值而不是累积值。有没有办法从表t中选择to_char(t.columnName,Format),t.*而不选择columnName两次?为什么WCF像我期待的那样返回myObject []而不是List <T>?为什么查询返回System.Data.Entity.Infrastructure.DbQuery<T>而不是T-SQL查询字符串有没有办法让Swashbuckle向WebAPI2 IQueryable<T>端点添加OData参数?有没有办法让‘of’报告使用的观测量(而不是省略)?有没有办法让函数返回竞争承诺的值(就像AWAIT做的那样)?有没有办法让2个参数的泛型类型T强制使用相同的类型?有没有办法让zsh补全完全基于单词的前缀而不是后缀?有没有办法让“删除”作为JMenuItem的快捷方式而不是“删除”gRPC服务器流可以返回一个流到Blazor Wasm而不是IAsyncEnumerable<T>吗?有没有办法让R脚本在收到错误消息后继续而不是停止执行?在jQuery中有没有办法修改.html(),让它添加代码而不是覆盖代码?PostgreSQL有没有办法返回本地名称的月份名称,而不是英语?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

破解 Kotlin 协程(5) - 协程取消篇

我们应该想办法线程内部正在运行的任务跟我们合作把任务停掉,这样线程内部的任务停止之前还有机会清理一些资源,比如关闭流等等。...NullPointerException("ResponseBody is null.")) } }) } 我们这里用到了 suspendCancellableCoroutine,不是之前的...) 我们启动一个协程,在其中执行网络请求,那么正常来说,这时候 getUserCoroutine 返回的 Deferred 可以当做一个子协程,它应当遵循默认的作用域规则,在父作用域取消时被取消掉,但现实却并不是这样...那么有没有办法解决这个问题呢? 直接解决还是比较困难的,因为 CompletableDeferred 构造所处的调用环境不是 suspend 函数,因而也没有办法拿到(很可能根本就没有!)父协程。...: Any> Call.await(): T { return suspendCancellableCoroutine { continuation -> enqueue(

1.8K50
  • 通用「接口缓存中间件」的一种实现

    在 HTTP Server 中,缓存同样重要:因为它有办法所有的查询接口保持在 50ms 以内,不管依赖的服务有多慢。 是不是单单这一条,就让人无法拒绝呢。...await getCacheFn(cacheKey, ctx, next); } catch (e) { console.error('缓存中间件出错', e); throw...e; // 不能降级,有可能 next 已经执行了 // await next(); } }; 看看刚刚发生了什么。...const result = await defaultRedisClient.get(key); if (result) defaultLocalCache.setex(localCacheKey...上面的实现是根据时间失效, LRU 是根据数量失效的:只保留最近使用的几个。 从这里,不难看出它们的利弊:高并发应用,LRU 能有效防止内存撑爆。 所以,一定要根据应用实际场景决策。

    92610

    C# 高级:TAP 异步编程

    .NET 的 Task 是为了简化使用“Promise”而设计的 API。 Task 表示不返回值的操作,Task 表示返回 T 类型的值的操作。...虽然工作是在某种上下文中执行的(操作系统确实要把数据传递给设备驱动程序并中断响应),但没有线程专门用来等待请求的数据回返回。这使得系统可以处理更大的工作量,不是干等着某个 I/O 调用完成。... Yield 的作用就是让出等待的位置,后面排除的任务先行。它字面上的意思就是让步,当任务做出让步时,其它任务就可以尽快被分配线程去执行。...解决办法很简单,作为异步方法调用者,我们只需改用 await 即可: private async void button1_Click(object sender, EventArgs e) {...它使我们可以只关注业务层面要处理的任务,不必关心和使用线程或线程池。重要的是要把 Task 理解为发起异步工作的抽象,不是对线程的抽象。

    1K20

    在 WPFUWP 中实现一个可以用 await 异步等待 UI 交互操作的 Awaiter

    代码在 await 异步等待之后能够继续回到此 UI 线程,不是随便从线程池找一个线程执行。...那么开始,既然要去掉 Task.Run,那么我们需要在后台线程真正完成任务的时候自动去执行接下来的任务,不是在调用线程中去等待。...asyncOperation; } } } 解释一下: Create() 静态方法会返回一个可以等待的 DispatcherAsyncOperation 实例,在写实现代码的地方当然不是用来等的...,这个值是用来给外部使用 await 的开发者返回的。...参数中的 continuation 是对 await 后面代码的一层包装,调用它即可让 await 后面的代码开始执行。但是,我们却并不是立即就能得到后台线程的返回值。

    3.4K31

    破解 Kotlin 协程(6) - 协程挂起篇

    抱歉这篇文章我实在是没办法写的更通俗易懂了,大家一定要亲手实践!) 1....sleep 线程进入休眠状态,直到指定时间之后某种信号或者条件到达,线程就尝试恢复执行, delay 会协程挂起,这个过程并不会阻塞 CPU,甚至可以说从硬件使用效率上来讲是“什么都不耽误”,从这个意义上讲...不过这样说起来还是很抽象,因为有一处非常的可疑: suspendCoroutineUninterceptedOrReturn 的返回值类型是 T传入的 lambda 的返回值类型是 Any?...>): Any { ... } suspend 一方面为这个方法添加了一个 Continuation 的参数,另一方面,原先的返回值类型 User 成了 Continuation 的泛型实参,真正的返回值类型竟然是...简单来说就是,对于 suspend 函数,不是一定要挂起的,可以在需要的时候挂起,也就是要等待的协程还没有执行完的时候,等待协程执行完再继续执行;如果在开始 join 或者 await 或者其他 suspend

    1.2K30

    关于C#异步编程你应该了解的几点建议

    不过,要想发挥异步任务的功效,就必须保证把这项任务交出去确实能够少占用一些资源,不是仅仅会在相似的资源之间进行上下文切换。...因此,无论有没有必要切换上下文,系统都会切换至早前捕获到的那个上下文,并把await之后的语句放在那个上下文执行。 如果不想系统做出这样的安排,那么可以调用ConfigureAwait()方法。...,不是切换回早前的上下文。...缓存泛型异步方法的返回值 可能你在进行异步编程的时候对异步方法设置的返回类型都是Task或者Task,然而有些时候把返回值类型设为Task可能会影响性能。...如果你的异步方法可以根据早前缓存起来的结果直接返回相应的值,那么尤其应该考虑把返回值类型设置为ValueTask。

    1.1K10

    C#异步使用要点(翻译)

    会将一个工作项在线程池进行排队,计算,返回.并且使用Task.FromResult在具有SynchronizationContext 程序中(例如WinForm)调用Result或wait()并不会死锁...所以建议使用await代替continueWith 下面例子就是使用continueWith private void button1_Click(object sender, EventArgs e...streamWriter.FlushAsync(); } } 11.建议使用 async/await不是直接返回Task 使用async/await 代替直接返回Task具有以上好处 异步和同步的异常都被始终被规范为了异步...代码更容易修改(例如:增加一个using) 异步的方法诊断起来更加容易(例如:调试,挂起) 抛出的异常将自动包装在返回的任务之中,不是抛出实际异常 下面这个错误的例子是将Task直接返回给了调用者...); return Ok(person); } } 可以改成缓存线程本身,不是结果,这样将不会导致线程池饥饿 public class PersonController : Controller

    3.4K50

    使用异步操作时的注意要点(翻译)

    会将一个工作项在线程池进行排队,计算,返回.并且使用Task.FromResult在具有SynchronizationContext 程序中(例如WinForm)调用Result或wait()并不会死锁...对于编写类库的人来说TaskCompletionSource是一个具有非常重要的作用,默认情况下任务延续可能会在调用try/set(Result/Exception/Cancel)的线程上进行运行...streamWriter.FlushAsync(); } } 11.建议使用 async/await不是直接返回Task 使用async/await 代替直接返回Task具有以上好处 异步和同步的异常都被始终被规范为了异步...代码更容易修改(例如:增加一个using) 异步的方法诊断起来更加容易(例如:调试,挂起) 抛出的异常将自动包装在返回的任务之中,不是抛出实际异常 ❌下面这个错误的例子是将Task直接返回给了调用者...); return Ok(person); } } ☑️可以改成缓存线程本身,不是结果,这样将不会导致线程池饥饿 public class PersonController : Controller

    4.6K20

    Python异步IO操作,看这个就够了

    不是一个严格的定义,从下面两个方面来理解: 异步程序可以在等待其最终结果的同时“暂停”并其他程序同时运行。 通过上述机制,异步代码有助于并发执行。换句话说,异步代码表现出了并发的特点。...3、async/await 语法及协程 异步 IO 的核心是协程。协程是一种特殊的 Python 函数,可以在到达返回值之前暂停其执行,并且可以将控制权间接传递给另一个协程一段时间。...如果 Python 在 g() 范围内遇到 await f() 表达式,那就意味着,“暂停 g() 的执行,直到我等待f() 返回结果。同时,其他协程运行。”。...第一个协程是辅助函数,它们返回一个随机字符串。生产者将 1 到 5 个项目放入队列中。每个项目都是(i,t) 的元组,其中 i 是随机字符串,t 是生产者尝试将元组放入队列的时间。...a = await asyncio.gather(t, t2) ...

    2.7K31

    .NET如何避免线程摸鱼,请用异步技术 async await 拿捏他~

    很多Web框架,收到一个请求,就会创建一个线程来处理,如果片刻间内有100个用户请求这个方法,那么就得安排100个线程,有没有方法第1个线程在等待数据返回时,先去接待第N+1个用户(校验请求参数什么的...)这样就能大大减少线程数量~ 通过上面的例子,我相信你已有所悟:异步就是避免线程摸鱼。...要将代码的执行过程写成异步的,也不是容易的事情。...也就是说单单使用 async 还不够,还得必须同时使用 await Task 类 通常来说,我们使用 httpClient.GetAsync,都是希望能处理返回的数据。...//Task.WaitAll(t1, t2, t3); //await Task.Yield(); //await Task.Delay(0); Console.WriteLine

    21610

    C#:异步编程中的 async 和 await

    ; async 唯一的用处是给await提供上下文,做向下兼容的; 如果函数被标记为 async,函数体内部的 await 才会被解释成关键字,不会当成是一个函数,所以说当方法中有使用 await 关键字调用异步方法...答案当然不是await 关键字后面的调用会在单独的线程中; 如果是多个异步方法调用会同步进行,看下面的示例 static async Task Main(string[] args)...; 返回 void 的异步方法没有办法在调用的时候使用 await ; 无法处理异常。...Task 没有返回值的异步方法,我们应该返回 Task: 可以使用 Task 定义的变量来接收方法的返回值,该变量可以作为参数进行传递; 方法在调用时可以使用 await 关键字; 可以捕获状态,看下面例子...Task 当异步方法需要返回一个值,给后面的步骤使用的的时候,就使用 Task,在调用的时候使用 Result 属性进行值的获取。

    2.5K20

    破解 Kotlin 协程(1) - 入门篇

    这看上去有些费解,因为直觉告诉我们,getUser 返回了一个 Deferred 类型,它的 await 方法会返回一个 User 对象,意味着 await 需要等待请求结果返回才可以继续执行,那么 await...public fun resumeWith(result: Result) } 1.3 的源码其实并不是很直接,尽管我们可以再看下 Result 的源码,但我不想这么做。... response); void onFailure(Call call, Throwable t); } 有结果正常返回的时候,Continuation 调用 resume 返回结果,...(e: Exception) { showError(e) } } 代码之所以可以看起来是同步的,那就是编译器的黑魔法了,你当然也可以叫它“语法糖”。...,还得经常处理线程切换,这似乎并不是一件难事,但随着代码体量的增加,它会你抓狂,线上上报的异常因线程使用不当导致的可不在少数。

    80000
    领券