opentween / OpenTween

TwitterクライアントのTweenからフォークしたオープンなプロジェクト
https://www.opentween.org/
Other
275 stars 76 forks source link

ListLatestTweetsTimelineRequestで発生したIOExceptionがハンドルされない #243

Closed upsilon closed 9 months ago

upsilon commented 9 months ago
動作環境:
   オペレーティング システム: Microsoft Windows NT 10.0.19045.0
   共通言語ランタイム: 4.0.30319.42000
   OpenTween.exeのバージョン: 3.7.1.0
例外 System.IO.IOException: 読み取り操作に失敗しました。内部例外を参照してください。
   場所 System.Net.Http.HttpClientHandler.WebExceptionWrapperStream.Read(Byte[] buffer, Int32 offset, Int32 count)
   場所 System.IO.BufferedStream.ReadByte()
   場所 System.Runtime.Serialization.Json.JsonEncodingStreamWrapper.ReadEncoding()
   場所 System.Runtime.Serialization.Json.JsonEncodingStreamWrapper.InitForReading(Stream inputStream, Encoding expectedEncoding)
   場所 System.Runtime.Serialization.Json.XmlJsonReader.SetInput(Stream stream, Encoding encoding, XmlDictionaryReaderQuotas quotas, OnXmlDictionaryReaderClose onClose)
   場所 OpenTween.Api.GraphQL.ListLatestTweetsTimelineRequest.<Send>d__15.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 OpenTween.Twitter.<GetListStatus>d__124.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 OpenTween.Models.ListTimelineTabModel.<RefreshAsync>d__15.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 OpenTween.TweenMain.<RefreshTabAsync>d__108.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 OpenTween.TimelineScheduler.<RunUpdateTasks>d__42.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 OpenTween.TimelineScheduler.<TimerCallback_Normal>d__40.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 OpenTween.TimelineScheduler.<TimerCallback>d__39.MoveNext()
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 OpenTween.AsyncTimer.<TimerCallback>d__14.MoveNext()

-----InnerException[0]-----

例外 System.Net.WebException: 要求は中止されました: 要求が取り消されました
   場所 System.Net.GZipWrapperStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   場所 System.Net.Http.HttpClientHandler.WebExceptionWrapperStream.Read(Byte[] buffer, Int32 offset, Int32 count)
upsilon commented 9 months ago

XmlJsonReader.SetInput() メソッドは JsonReaderWriterFactory.CreateJsonReader() の内から呼ばれている。 https://referencesource.microsoft.com/System.Runtime.Serialization/System/Runtime/Serialization/Json/JsonReaderWriterFactory.cs.html#39

219 にて IOException をハンドルするように修正していたが、CreateJsonReader の行は追加した try-catch ブロックの外にあったためこの問題が起きている。

https://github.com/opentween/OpenTween/blob/d92e431453b281d1f23149d3e75809309ffe752e/OpenTween/Api/GraphQL/ListLatestTweetsTimelineRequest.cs#L89-L99