C# Discord 机器人错误 : Newtonsoft. Json.JsonReaderException

标签 c# .net-core discord

我正在尝试制作一个 discord 机器人,但我在连接到 discord 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 指向我的 static void main 函数。

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

为了制作一个不和谐的机器人,我遵循了这个指南:https://docs.stillu.cc/guides/getting_started/first-bot.html

那篇文章指出,如果在异步函数中抛出任何异常,它们将一直抛回到第一个非异步方法,即 main 方法。那么这是否意味着错误出在我的 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 以及我可以做些什么来消除这个错误吗? 我感谢任何帮助。这也是我第一次在堆栈溢出中发布问题,所以如果我在提问方面做得不对,请告诉我。

最佳答案

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

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 错误,例如 404,其中包含 html 响应而不是预期的 json,因此为什么该错误提示意外的“<”,如 ... 而不是 {在 {...} 中,尽管这只是一种预感。

关于C# Discord 机器人错误 : Newtonsoft. Json.JsonReaderException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56815156/

相关文章:

c# - 在 WPF 中绘制和删除形状

c# - 如何等待多个 IAsyncEnumerable

python - (Discord.py) 固定消息

javascript - Bot 将字符串返回到我没有指定的数字

discord - 如何限制某个角色使用命令(discord.py)

c# - Windows Shell Automation InvokeVerb 基于数字而不是命令字符串

c# - C# 中的 strstr() 等价物

c# - 如何将文本 block 可见性绑定(bind)到另一个文本 block 文本属性

linux - 如何在 Linux 上的 .Net Core 中捕获双页错误(内存映射文件读取错误)?

c# - 多个值包含动态 Linq