수색…


소개

Rust 프로그램이 심각한 오류가 발생한 상태에 도달하면 panic! 매크로는 빨리 종료 할 때 호출 할 수 있습니다 (종종 비교되지만 약간 다른 경우 다른 언어에서는 예외가됩니다). 적절한 오류 처리에는 Result 유형이 포함되어야합니다.이 단원에서는 panic! 대해서만 설명합니다 panic! 및 그 개념.

비고

패닉이 항상 메모리 누수 또는 기타 리소스 누출을 일으키는 것은 아닙니다. 사실, 패닉은 일반적으로 RAII 불변 변수를 보존하고, 스택이 푸는 동안 구조체의 소멸자 (Drop 구현)를 실행합니다. 그러나이 과정에서 두 번째 패닉이 발생하면 프로그램이 중단됩니다. 이 시점에서 RAII 불변의 보증은 무효입니다.

당황하지 마라.

Rust에는 프로그램에서 무엇인가 잘못되었다는 것을 나타내는 두 가지 주요 메서드가 있습니다. Result<T, E> 유형 ( panic! )에서 ( 잠재적으로 사용자 정의 된 ) Err(E) 반환하는 함수 panic! .

패닉은 다른 언어에서 흔히 볼 수있는 예외의 대안이 아닙니다 . 녹 (Rust)에서 공포는 무언가가 심각하게 잘못되었으며 계속할 수 없다는 것을 나타내는 것입니다. push 위한 Vec 소스의 예제는 다음과 같습니다.

pub fn push(&mut self, value: T) {
    // This will panic or abort if we would allocate > isize::MAX bytes
    // or if the length increment would overflow for zero-sized types.
    if self.len == self.buf.cap() {
        self.buf.double();
    }
    ...
}

메모리가 부족하면 Rust가 할 수있는 일은별로 없으므로 패닉 (기본 동작) 또는 중단 (컴파일 플래그로 설정해야 함) 중 하나입니다.

Panicking은 스택을 풀고 소멸자를 실행하고 메모리가 정리되도록합니다. Abort는 이것을하지 않으며 OS를 올바르게 사용하여 정리합니다.

다음 프로그램을 정상적으로 실행하십시오.

[profile.dev]
panic = "abort"

당신의 Cargo.toml .

// main.rs
struct Foo(i32);
impl Drop for Foo {
    fn drop(&mut self) {
        println!("Dropping {:?}!", self.0);
    }
}
fn main() {
    let foo = Foo(1);
    panic!("Aaaaaaahhhhh!");
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow