【问题标题】:C# Discord Bot Error: Newtonsoft.Json.JsonReaderExceptionC# Discord Bot 错误:Newtonsoft.Json.JsonReaderException
【发布时间】:2019-11-10 21:35:03
【问题描述】:

我正在尝试制作一个不和谐的机器人,但我在连接不和谐 API 时遇到问题。我正在使用 Visual Studio Community 2019。我使用 .net 核心控制台应用程序模板开始了这个项目。我的 .net 核心版本是 2.2。我已经学习了几个教程,甚至从 git 中提取了一些示例机器人,它们都给了我相同的 Newtonsoft.Json.JsonReaderException 未处理异常错误。

我确实安装了 Discord.Net nuget 包,版本 2.1.1,起初我很困惑,因为我以为我根本没有处理 jsons,但后来意识到 discord.net nuget 包也安装了newtonsoft.json版本 11.0.2。我尝试安装该软件包以查看是否解决了我的问题,但没有解决,我尝试安装版本 11.0.2 和 12.0.2(发布本文时的最新版本)。

运行应用程序时,我的程序停止,Visual Studio 指向我的静态 void 主函数。

Newtonsoft.Json.JsonReaderException: 'Unexpected character encountered while parsing value: <. Path '', line 0, position 0.' 

对于制作不和谐机器人的这一特殊尝试,我遵循了本指南:https://docs.stillu.cc/guides/getting_started/first-bot.html

那篇文章指出,如果在异步函数中抛出任何异常,它们将一直抛出到第一个非异步方法,即主方法。那么这是否意味着错误出现在我的 MainAsync 函数中?

如果我让应用崩溃,确切的错误是这样的:

Exception thrown: 'Newtonsoft.Json.JsonReaderException' in System.Private.CoreLib.dll
An unhandled exception of type 'Newtonsoft.Json.JsonReaderException' occurred in System.Private.CoreLib.dll
Unexpected character encountered while parsing value: <. Path '', line 0, position 0.

这是我唯一的文件:

using System;
using Discord;
using System.Threading.Tasks;
using Discord.WebSocket;

namespace Bot
{
    class Program
    {
        private DiscordSocketClient Client;

        static void Main() => new Program().MainAsync().GetAwaiter().GetResult();

        public async Task MainAsync()
        {
            Client = new DiscordSocketClient();
            Client.Log += Log;

            //This is my discord bot token
            var token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXX";

            await Client.LoginAsync(TokenType.Bot, token);
            await Client.StartAsync();
            await Task.Delay(-1);
        }

        private Task Log(LogMessage message)
        {
            Console.WriteLine(message.ToString());
            return Task.CompletedTask;
        }
    }
}

如果我自己不处理 json 文件,有人可以向我解释为什么我会得到 newtonsoft.json,我可以做些什么来摆脱这个错误? 我很感激任何帮助。这也是我第一次在堆栈溢出中发布问题,所以如果我在提问方面做得不对,请告诉我。

【问题讨论】:

标签: c# .net-core discord


【解决方案1】:

为了追踪错误,我建议将每个调用包装在一个 try/catch 块中。然后记录错误发生的位置。

using System;
using Discord;
using System.Threading.Tasks;
using Discord.WebSocket;

namespace Bot
{
    class Program
    {
        private DiscordSocketClient Client;

        static void Main() => new Program().MainAsync().GetAwaiter().GetResult();

        public async Task MainAsync()
        {
            try{
            Client = new DiscordSocketClient();
            Client.Log += Log;
            }catch(Exception ex){log("Error in init:"); throw ex;}
            //This is my discord bot token
            var token = "XXXXXXXXXXXXXXXXXXXXXXXXXXXX";
            try{
            await Client.LoginAsync(TokenType.Bot, token);
            }catch(Exception ex){log("Error during login"); throw ex;}
            try{
            await Client.StartAsync();
            }catch(ex){log("Error starting client"); throw ex;
            await Task.Delay(-1);
        }
        private Task log(string message)
        {
            Console.WriteLine(message);
            return Task.CompletedTask;
        }            
        private Task Log(LogMessage message)
        {
            Console.WriteLine(message.ToString());
            return Task.CompletedTask;
        }
    }
}

随着项目规模的增长,还建议在消息中包含文件名和行号。

JSON 似乎被用作与 discord 通信的 API 的一部分。 https://discordapp.com/developers/docs/intro 我看到参考资料是那里的几个主题,包括来自错误的消息。可能是您收到了一些 http 错误,例如包含 html 响应而不是预期的 json 的 404,因此错误提示了 ... 中的意外 '

【讨论】:

  • 要跟踪错误,可以更轻松地为所有异常打开“抛出时中断”,然后在发生错误时立即停止调试器。在某些方面,我发现添加异常处理程序会使过程更加困难
  • 只需使用断点并使用调试器逐行逐行执行代码。在每个调用周围添加一个 try/catch 有点过分。
  • 我建议记录异常,也许使用 .NET 中的标准日志记录。此外,您应该使用不带 ex 的 throw,这样您就不会展开调用堆栈。异常应具有文件名、行和调用堆栈上的位置。
【解决方案2】:

您的代码完美运行。我刚刚插入了我的令牌,机器人就启动了。检查您的令牌是否正确,并可能将令牌设为字符串

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-05
    • 2018-05-02
    • 2021-07-15
    • 2019-02-03
    • 2018-03-12
    • 2018-03-04
    • 2021-02-16
    • 2021-01-28
    相关资源
    最近更新 更多