Why does decrypting modified AES-CBC ciphertext fail decryption?

I am trying to get familiar with encryption/decryption. I am using deno as it supports the web crypto API.

I can encrypt and decrypt to get back the original plaintext using AES-CBC.

What I am now doing now is to encrypt, then manually modify the ciphertext and then decrypt. My expectation is that this would still work since I understand that AES-CBC does not provide integrity and authenticity check. (AES-GCM is the one that is AEAD)

But when I modify the cipher text and try to decrypt, it fails with the following error:

error: Uncaught (in promise) OperationError: Decryption failed
let deCryptedPlaintext = await window.crypto.subtle.decrypt(param, key, asByteArray);
                         ^
    at async SubtleCrypto.decrypt (deno:ext/crypto/00_crypto.js:598:29)
    at async file:///Users/me/delete/run.js:33:26

Does AES-CBC also have integrity checks? Or why is the decryption failing?

How many English words
do you know?
Test your English vocabulary size, and measure
how many words do you know
Online Test
Powered by Examplum