Home > OS >  Javascript - error handling stopping code
Javascript - error handling stopping code

Time:12-29

quick basic question,

When setting up guildmember.timout with discord.js v13, it gives an example with .then(console.log) and .catch(console.error). Using the example, the code will continue after the .catch.

      muteMember
        .timeout(time, reason)
        .catch((error) => {
          return errors(client, message, args, "mute", error, true);
        });

      muteMember.send ... 

At the moment it will run the errors function then continue onto the code after the .catch, for example muteMember.send. What's the best way to have it "stop" after it runs what is inside of the .catch? Thank you in advance

CodePudding user response:

You can make it return a falsy if the error occurs, then check if it is falsy, and return if it is.

let isModified = await muteMember
        .timeout(time, reason)
        .catch((error) => {
            errors(client, message, args, "mute", error, true)
            return false;
        })
if (!isModified) return;

CodePudding user response:

You can use async-await with try-catch:

async function myFunction()
{
  try
  {
    await muteMember.timeout(time, reason)
    // throws an error if it fails -- jumps to the catch block

    muteMember.send...
  }
  catch(error)
  {
    errorcheck = true
    errors(client, message, args, "mute", error, true);
    // and whatever other error handling you would like
  }
}

CodePudding user response:

The return statement only returns out of the #catch callback. Handle the promise with a #then callback, thats where you want your code to run when its successful.

muteMember
    .timeout(time, reason)
    .catch((error) => {
        //error
        errorcheck = true
        return errors(client, message, args, "mute", error, true);
    })
    .then(() => {
        //success
    })

CodePudding user response:

muteMember.timeout() returns a Promise, so any code that you want to run after the promise resolves you should wrap in a then() block:

muteMember
        .timeout(time, reason)
        .then((member) => {
          // code that depends on successfully timing out a member
          muteMember.send....
        })
        .catch((error) => {
          // only runs if there's an error
          errorcheck = true
          return errors(client, message, args, "mute", error, true);
        });

You can also use the more modern and readable async/await syntax:

const myAsyncFunction = async () => {
  try {
    const member = await muteMember.timeout(time, reason);
    // code that depends on successfully timing out a member
    muteMember.send....
  } catch (error) {  
    // only runs if there's an error
    errorcheck = true
    return errors(client, message, args, "mute", error, true);
  }
}
    
  • Related